#Область ПрограммныйИнтерфейс

#Область КонструкторыТиповДляСовместимости

// Пустое описание оповещения.
// 
// Возвращаемое значение:
//  ОписаниеОповещения - Пустое описание оповещения
Функция НовыйПустоеОписаниеОповещения() Экспорт
	Возврат Новый ОписаниеОповещения(,);
КонецФункции

#КонецОбласти

#Область МетодыСобытияПриложения

Процедура ПриНачалеРаботыСистемы() Экспорт
	ПараметрыСтартаСеанса=УИ_ОбщегоНазначенияВызовСервера.ПараметрыСтартаСеанса();

	Если ПараметрыСтартаСеанса.ДобавленыПраваНаРасширение Тогда
		ЗавершитьРаботуСистемы(Ложь, Истина);
	КонецЕсли;

	УИ_ПараметрыПриложения.Вставить("НомерСеанса", ПараметрыСтартаСеанса.НомерСеанса);
	УИ_ПараметрыПриложения.Вставить("ЯзыкСинтаксисаКонфигурации", ПараметрыСтартаСеанса.ЯзыкСинтаксисаКонфигурации);

	УИ_ПараметрыПриложения.Вставить("ЭтоLinuxКлиент", УИ_ОбщегоНазначенияКлиентСервер.ЭтоLinux());
	УИ_ПараметрыПриложения.Вставить("ЭтоWindowsКлиент", УИ_ОбщегоНазначенияКлиентСервер.ЭтоWindows());
	УИ_ПараметрыПриложения.Вставить("ЭтоВебКлиент", ЭтоВебКлиент());
	УИ_ПараметрыПриложения.Вставить("ЭтоПортативнаяПоставка", УИ_ОбщегоНазначенияКлиентСервер.ЭтоПортативнаяПоставка());
	УИ_ПараметрыПриложения.Вставить("ПолеHTMLПостроеноНаWebkit",
									УИ_ОбщегоНазначенияКлиентСервер.ПолеHTMLПостроеноНаWebkit());
	УИ_ПараметрыПриложения.Вставить("ВерсияПлатформы",
									УИ_ОбщегоНазначенияКлиентСервер.ТекущаяВерсияПлатформы1СПредприятие());
	//УИ_ПараметрыПриложения.Вставить("АдресОписанияМетаданныхКонфигурации", УИ_ОбщегоНазначенияВызовСервера.АдресОписанияМетаданныхКонфигурации());

	ПараметрыСеансаВХранилище = Новый Структура;
	ПараметрыСеансаВХранилище.Вставить("ЭтоLinuxКлиент", УИ_ПараметрыПриложения["ЭтоLinuxКлиент"]);
	ПараметрыСеансаВХранилище.Вставить("ЭтоВебКлиент", УИ_ПараметрыПриложения["ЭтоВебКлиент"]);
	ПараметрыСеансаВХранилище.Вставить("ЭтоWindowsКлиент", УИ_ПараметрыПриложения["ЭтоWindowsКлиент"]);
	ПараметрыСеансаВХранилище.Вставить("ЭтоПортативнаяПоставка", УИ_ПараметрыПриложения["ЭтоПортативнаяПоставка"]);
	ПараметрыСеансаВХранилище.Вставить("ПолеHTMLПостроеноНаWebkit", УИ_ПараметрыПриложения["ПолеHTMLПостроеноНаWebkit"]);
	ПараметрыСеансаВХранилище.Вставить("ВерсияПлатформы", УИ_ПараметрыПриложения["ВерсияПлатформы"]);
	//ПараметрыСеансаВХранилище.Вставить("АдресОписанияМетаданныхКонфигурации", УИ_ПараметрыПриложения["АдресОписанияМетаданныхКонфигурации"]);

	УИ_ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить(УИ_ОбщегоНазначенияКлиентСервер.КлючОбъектаВХранилищеНастроек(),
																	УИ_ОбщегоНазначенияКлиентСервер.КлючНастроекПараметровСеанса(),
																	ПараметрыСеансаВХранилище);

КонецПроцедуры

#КонецОбласти

// Выводит текст, который пользователь может скопировать.
//
// Параметры:
//   Обработчик - ОписаниеОповещения - Описание процедуры, которая будет вызвана после завершения показа.
//       Возвращаемое значение аналогично ПоказатьВопросПользователю().
//   Текст     - Строка - Текст информации.
//   Заголовок - Строка - Необязательный. Заголовок окна. По умолчанию "Подробнее".
//
Процедура ПоказатьПодробнуюИнформацию(Обработчик, Текст, Заголовок = Неопределено) Экспорт
	НастройкиДиалога = Новый Структура;
	НастройкиДиалога.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Ложь);
	НастройкиДиалога.Вставить("Картинка", Неопределено);
	НастройкиДиалога.Вставить("ПоказыватьКартинку", Ложь);
	НастройкиДиалога.Вставить("МожноКопировать", Истина);
	НастройкиДиалога.Вставить("КнопкаПоУмолчанию", 0);
	НастройкиДиалога.Вставить("ВыделятьКнопкуПоУмолчанию", Ложь);
	НастройкиДиалога.Вставить("Заголовок", Заголовок);
	
	Если Не ЗначениеЗаполнено(НастройкиДиалога.Заголовок) Тогда
		НастройкиДиалога.Заголовок = НСтр("ru = 'Подробнее'");
	КонецЕсли;
	
	Кнопки = Новый СписокЗначений;
	Кнопки.Добавить(0, НСтр("ru = 'Закрыть'"));
	
	ПоказатьВопросПользователю(Обработчик, Текст, Кнопки, НастройкиДиалога);
КонецПроцедуры

// Показать форму вопроса.
//
// Параметры:
//   ОписаниеОповещенияОЗавершении - ОписаниеОповещения - описание процедуры, которая будет вызвана после закрытия окна
//                                                        вопроса со следующими параметрами:
//                                                          РезультатВопроса - Структура - структура со свойствами:
//                                                            Значение - результат выбора пользователя: значение
//                                                                       системного перечисления или значение,
//                                                                       связанное с нажатой кнопкой. В случае закрытия
//                                                                       диалога по истечении времени - значение
//                                                                       Таймаут.
//                                                            БольшеНеЗадаватьЭтотВопрос - Булево - результат выбора
//                                                                                                  пользователя в
//                                                                                                  одноименном флажке.
//                                                          ДополнительныеПараметры - Структура 
//   ТекстВопроса                  - Строка             - текст задаваемого вопроса. 
//   Кнопки                        - РежимДиалогаВопрос, СписокЗначений - может быть задан список значений, в котором:
//                                       Значение - содержит значение, связанное с 
//                                                  кнопкой и возвращаемое при выборе кнопки. В качестве значения может
//                                                  использоваться значение
//                                                  перечисления КодВозвратаДиалога, а также другие значения,
//                                                  поддерживающее XDTO-сериализацию.
//                                       Представление - задает текст кнопки.
//
//   ДополнительныеПараметры       - Структура          - см. СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю.
//
// Возвращаемое значение:
//   Результат выбора пользователя будет передан в метод, описанный параметром ОписаниеОповещенияОЗавершении. 
//
Процедура ПоказатьВопросПользователю(ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки,
	ДополнительныеПараметры = Неопределено) Экспорт
	
	Если ДополнительныеПараметры <> Неопределено Тогда
		Параметры = ДополнительныеПараметры;
	Иначе
		Параметры = Новый Структура;
	КонецЕсли;
	
	УИ_ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Параметры, ПараметрыВопросаПользователю(), Ложь);
	
	КнопкиПараметр = Кнопки;
	
	Если ТипЗнч(Параметры.КнопкаПоУмолчанию) = Тип("КодВозвратаДиалога") Тогда
		//@skip-warning
		Параметры.КнопкаПоУмолчанию = КодВозвратаДиалогаВСтроку(Параметры.КнопкаПоУмолчанию);
	КонецЕсли;
	
	Если ТипЗнч(Параметры.КнопкаТаймаута) = Тип("КодВозвратаДиалога") Тогда
		Параметры.КнопкаТаймаута = КодВозвратаДиалогаВСтроку(Параметры.КнопкаТаймаута);
	КонецЕсли;
	
	Параметры.Вставить("Кнопки", КнопкиПараметр);
	Параметры.Вставить("ТекстСообщения", ТекстВопроса);
	
	ОповещениеДляЗапуска=ОписаниеОповещенияОЗавершении;
	Если ОповещениеДляЗапуска = Неопределено Тогда
		ОповещениеДляЗапуска=ПустоеОписаниеОповещенияДляЗапускаПриложения();
	КонецЕсли;
	
	ПоказатьВопрос(ОповещениеДляЗапуска, ТекстВопроса, КнопкиПараметр, , Параметры.КнопкаПоУмолчанию, "",
	Параметры.КнопкаТаймаута);
	
КонецПроцедуры

// Возвращает новую структуру дополнительных параметров для процедуры ПоказатьВопросПользователю.
//
// Возвращаемое значение:
//  Структура   - структура со свойствами:
//    * КнопкаПоУмолчанию             - Произвольный - определяет кнопку по умолчанию по типу кнопки или по связанному
//                                                     с ней значению.
//    * Таймаут                       - Число        - интервал времени в секундах до автоматического закрытия окна
//                                                     вопроса.
//    * КнопкаТаймаута                - Произвольный - кнопка (по типу кнопки или по связанному с ней значению), 
//                                                     на которой отображается количество секунд, оставшихся до
//                                                     истечения таймаута.
//    * Заголовок                     - Строка       - заголовок вопроса. 
//    * ПредлагатьБольшеНеЗадаватьЭтотВопрос - Булево - если Истина, то в окне вопроса будет доступен одноименный флажок.
//    * БольшеНеЗадаватьЭтотВопрос    - Булево       - принимает значение, выбранное пользователем в соответствующем
//                                                     флажке.
//    * БлокироватьВесьИнтерфейс      - Булево       - если Истина, форма вопроса открывается, блокируя работу всех
//                                                     остальных открытых окон, включая главное окно.
//    * Картинка                      - Картинка     - картинка, выводимая в окне вопроса.
//
Функция ПараметрыВопросаПользователю() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("КнопкаПоУмолчанию", Неопределено);
	Параметры.Вставить("Таймаут", 0);
	Параметры.Вставить("КнопкаТаймаута", Неопределено);
	Параметры.Вставить("Заголовок", КлиентскоеПриложение.ПолучитьЗаголовок());
	Параметры.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Истина);
	Параметры.Вставить("БольшеНеЗадаватьЭтотВопрос", Ложь);
	Параметры.Вставить("БлокироватьВесьИнтерфейс", Ложь);
	Параметры.Вставить("Картинка", БиблиотекаКартинок.УИ_Вопрос32);
	Возврат Параметры;
	
КонецФункции

// Возвращает строковое представление значения типа КодВозвратаДиалога.
Функция КодВозвратаДиалогаВСтроку(Значение)
	
	Результат = "КодВозвратаДиалога." + Строка(Значение);
	
	Если Значение = КодВозвратаДиалога.Да Тогда
		Результат = "КодВозвратаДиалога.Да";
	ИначеЕсли Значение = КодВозвратаДиалога.Нет Тогда
		Результат = "КодВозвратаДиалога.Нет";
	ИначеЕсли Значение = КодВозвратаДиалога.ОК Тогда
		Результат = "КодВозвратаДиалога.ОК";
	ИначеЕсли Значение = КодВозвратаДиалога.Отмена Тогда
		Результат = "КодВозвратаДиалога.Отмена";
	ИначеЕсли Значение = КодВозвратаДиалога.Повторить Тогда
		Результат = "КодВозвратаДиалога.Повторить";
	ИначеЕсли Значение = КодВозвратаДиалога.Прервать Тогда
		Результат = "КодВозвратаДиалога.Прервать";
	ИначеЕсли Значение = КодВозвратаДиалога.Пропустить Тогда
		Результат = "КодВозвратаДиалога.Пропустить";
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

#Область Алгоритмы

Функция ВыполнитьАлгоритм(АлгоритмСсылка, ВходящиеПараметры = Неопределено, ОшибкаВыполнения = Ложь,
	СообщениеОбОшибке = "") Экспорт
	Возврат УИ_АлгоритмыКлиентСервер.ВыполнитьАлгоритм(АлгоритмСсылка, ВходящиеПараметры, ОшибкаВыполнения,
	СообщениеОбОшибке)
КонецФункции

#КонецОбласти

#Область Отладка

Процедура ОткрытьКонсольОтладки(ТипОбъектаОтладки, ДанныеДляОтладки, УникальностьФормыКонсоли = Неопределено) Экспорт
	Если ВРег(ТипОбъектаОтладки) = "ЗАПРОС" Или ВРег(ТипОбъектаОтладки) = "МЕНЕДЖЕРВРЕМЕННЫХТАБЛИЦ" Тогда
		ИмяФормыКонсоли = "Обработка.УИ_КонсольЗапросов.Форма";
	ИначеЕсли ВРег(ТипОбъектаОтладки) = "СХЕМАКОМПОНОВКИДАННЫХ" Тогда
		ИмяФормыКонсоли = "Отчет.УИ_КонсольОтчетов.Форма";
	ИначеЕсли ВРег(ТипОбъектаОтладки) = "ОБЪЕКТБАЗЫДАННЫХ" Тогда
		ИмяФормыКонсоли = "Обработка.УИ_РедакторРеквизитовОбъекта.Форма";
	ИначеЕсли ВРег(ТипОбъектаОтладки) = "HTTPЗАПРОС" Тогда
		ИмяФормыКонсоли = "Обработка.УИ_КонсольHTTPЗапросов.Форма";
	Иначе
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ДанныеОтладки", ДанныеДляОтладки);
	
	Если УникальностьФормыКонсоли = Неопределено Тогда
		Уникальность = Новый УникальныйИдентификатор;
	Иначе
		Уникальность = УникальностьФормыКонсоли;
	КонецЕсли;
	
	ОткрытьФорму(ИмяФормыКонсоли, ПараметрыФормы, , Уникальность);
	
КонецПроцедуры

Процедура ЗапуститьКонсольОтладкиПоАдресуХраненияДанныхОтладки(АдресХранилищаНастроекОтладки, ЭтоФайл, ТипОбъектаОтладки,
	Пользователь = Неопределено, ИдентификаторФормы = Неопределено) Экспорт
	Если Не ЗначениеЗаполнено(АдресХранилищаНастроекОтладки) Тогда
		Возврат;
	КонецЕсли;

	Если ЭтоФайл Тогда
		АдресОбъектаОтладки = УИ_ОбщегоНазначенияВызовСервера.АдресОбъектаОтладкиВоВременномХранилищеИзКаталогаДанныхОтладки(АдресХранилищаНастроекОтладки,
																															 ИдентификаторФормы);
	Иначе
		АдресОбъектаОтладки= УИ_ОбщегоНазначенияВызовСервера.АдресОбъектаОтладкиВоВременномХранилищеИзСистемногоХранилищаНастроек(АдресХранилищаНастроекОтладки,
																																  Пользователь,
																																  ИдентификаторФормы);
	КонецЕсли;
	Если АдресОбъектаОтладки = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОткрытьКонсольОтладки(ТипОбъектаОтладки, АдресОбъектаОтладки);
КонецПроцедуры


#КонецОбласти

// Это веб клиент.
// 
// Возвращаемое значение:
//  Булево -  Это веб клиент
Функция ЭтоВебКлиент() Экспорт
	Возврат УИ_ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент();
КонецФункции


#Область ЗапускПриложений

// Пустое описание оповещения для запуска приложения.
// 
// Возвращаемое значение:
//  ОписаниеОповещения - Пустое описание оповещения для запуска приложения
Функция ПустоеОписаниеОповещенияДляЗапускаПриложения() Экспорт
	Возврат Новый ОписаниеОповещения("НачатьЗапускПриложенияЗавершениеПустое", ЭтотОбъект);
КонецФункции

// Начать запуск приложения завершение пустое.
// 
// Параметры:
//  КодВозврата - Число- Код возврата
//  ДополнительныеПараметры -Неопределено -Дополнительные параметры
Процедура НачатьЗапускПриложенияЗавершениеПустое(КодВозврата, ДополнительныеПараметры) Экспорт
	Если КодВозврата = Неопределено Тогда
		Возврат;
	КонецЕсли;
КонецПроцедуры

// Начать запуск приложения с подключением расширения работы с файлами.
// 
// Параметры:
//  ОписаниеОповещения - ОписаниеОповещения -  Содержит описание процедуры, которая будет вызвана после завершения
//  СтрокаКоманды - Строка - Командная строка для запуска приложения либо имя файла, ассоциированного с некоторым приложением.
//  ТекущийКаталог - Неопределено, Строка - Задает текущий каталог запускаемого приложения. В режиме веб-клиента игнорируется.
//  ДождатьсяЗавершения - Булево - дожидаться завершения запущенного приложения перед продолжением работы
Процедура НачатьЗапускПриложенияСПодключениемРасширенияРаботыСФайлами(ОписаниеОповещения, СтрокаКоманды,
	ТекущийКаталог = Неопределено, ДождатьсяЗавершения = Ложь) Экспорт
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ОписаниеОповещения", ОписаниеОповещения);
	ПараметрыОповещения.Вставить("СтрокаКоманды", СтрокаКоманды);
	ПараметрыОповещения.Вставить("ТекущийКаталог", ТекущийКаталог);
	ПараметрыОповещения.Вставить("ДождатьсяЗавершения", ДождатьсяЗавершения);

	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("НачатьЗапускПриложенияСПодключениемРасширенияРаботыСФайламиЗавершениеПодключенияРасширенияРаботыСФайлами",
		ЭтотОбъект, ПараметрыОповещения));
КонецПроцедуры

// Начать запуск приложения с подключением расширения работы с файлами завершение подключения расширения работы с файлами.
// 
// Параметры:
//  Результат - Булево - Расширение подключено успешно
//  ДополнительныеПараметры - Структура - Параметры оповещения:
//  	* ОписаниеОповещения - ОписаниеОповещения -  Содержит описание процедуры, которая будет вызвана после завершения
//  	* СтрокаКоманды - Строка - Командная строка для запуска приложения либо имя файла, ассоциированного с некоторым приложением.
//  	* ТекущийКаталог - Неопределено, Строка - Задает текущий каталог запускаемого приложения. В режиме веб-клиента игнорируется.
//  	* ДождатьсяЗавершения - Булево - дожидаться завершения запущенного приложения перед продолжением работы
Процедура НачатьЗапускПриложенияСПодключениемРасширенияРаботыСФайламиЗавершениеПодключенияРасширенияРаботыСФайлами(Результат,
	ДополнительныеПараметры) Экспорт
	
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;

	НачатьЗапускПриложения(ДополнительныеПараметры.ОписаниеОповещения,
						   ДополнительныеПараметры.СтрокаКоманды,
						   ДополнительныеПараметры.ТекущийКаталог,
						   ДополнительныеПараметры.ДождатьсяЗавершения);
КонецПроцедуры

#КонецОбласти

#Область РедактированиеТипов

// Открывает специальную форму для редактирования текста
// 
// Параметры:
//  Текст - Строка -  Текст
//  ОписаниеОповещенияОЗакрытии - Неопределено -  Описание оповещения о закрытии
//  Заголовок - Строка -  Заголовок
//  РежимОткрытия - Неопределено -  Режим открытия
//  ТолькоПросмотр - Булево -
Процедура ОткрытьФормуРедактированияТекста(Текст, ОписаниеОповещенияОЗакрытии, Заголовок = "",
	РежимОткрытия = Неопределено, ТолькоПросмотр = Ложь) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Текст", Текст);
	ПараметрыФормы.Вставить("Заголовок", Заголовок);
	ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр);

	Если РежимОткрытия = Неопределено Тогда
		ОткрытьФорму("ОбщаяФорма.УИ_ФормаРедактированияТекста", ПараметрыФормы, , , , , ОписаниеОповещенияОЗакрытии);
	Иначе
		ОткрытьФорму("ОбщаяФорма.УИ_ФормаРедактированияТекста",
					 ПараметрыФормы,
					 ,
					 ,
					 ,
					 ,
					 ОписаниеОповещенияОЗакрытии,
					 РежимОткрытия);
	КонецЕсли;
КонецПроцедуры

// Начать выбор значения перечисления.
// 
// Параметры:
//  Значение - ПеречислениеСсылкаИмяПеречисления, Тип - Значение
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения, - Описание оповещения о завершении
//  Владелец - ФормаКлиентскогоПриложения, ПолеФормы-ВладелецФормы
Процедура НачатьВыборЗначенияПеречисления(Значение, ОписаниеОповещенияОЗавершении = Неопределено,
	Владелец = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;

	Если ТипЗнч(Значение) = Тип("Тип") Тогда
		ПараметрыФормы.Вставить("ТипПеречисления", Значение);
	Иначе
		ПараметрыФормы.Вставить("ЗначениеПеречисления", Значение);
	КонецЕсли;

	ОткрытьФорму("ОбщаяФорма.УИ_ФормаВыбораЗначенияПеречисления",
				 ПараметрыФормы,
				 Владелец,
				 Строка(Новый УникальныйИдентификатор),
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Начать редактирования уникального идентификатора.
// 
// Параметры:
//  Значение - Неопределено, УникальныйИдентификатор - Значение
//  ОписаниеОповещенияОЗавершении - Неопределено, ОписаниеОповещения - Описание оповещения о завершении
//  Владелец - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы - Владелец
Процедура НачатьРедактированияУникальногоИдентификатора(Значение = Неопределено,
	ОписаниеОповещенияОЗавершении = Неопределено, Владелец = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;

	Если Значение <> Неопределено Тогда
		ПараметрыФормы.Вставить("Значение", Значение);
	КонецЕсли;

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторУникальногоИдентификатора",
				 ПараметрыФормы,
				 Владелец,
				 Строка(Новый УникальныйИдентификатор),
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
	
КонецПроцедуры

#КонецОбласти

// Варианты формы просмотра значения.
// 
// Возвращаемое значение:
//  Структура - Варианты формы просмотра значения:
// * ПоУмолчанию - Строка - 
// * Значение - Строка - 
// * Коллекция - Строка - 
Функция ВариантыФормыПросмотраЗначения() Экспорт
	Варианты = Новый Структура;
	Варианты.Вставить("ПоУмолчанию", "ПоУмолчанию");
	Варианты.Вставить("Значение", "Значение");
	Варианты.Вставить("Коллекция", "Коллекция");
	
	Возврат Варианты;
КонецФункции

// Просмотреть значение.
// 
// Параметры:
//  КонтейнерЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияУниверсальногоЗначения
//  Форма - ФормаКлиентскогоПриложения
//  Выражение - Строка -
//  ВариантФормы - Строка -
//  ОповещениеОЗавершении - Неопределено, ОписаниеОповещения - Оповещение о завершении
Процедура ПросмотретьЗначение(КонтейнерЗначения, Форма, Выражение, ВариантФормы = Неопределено, ОповещениеОЗавершении = Неопределено) Экспорт
	Если КонтейнерЗначения.ОписаниеТипа = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОповещенияДляФормы = ОповещениеОЗавершении;
	Если ОписаниеОповещенияДляФормы = Неопределено Тогда
		ОписаниеОповещенияДляФормы = НовыйПустоеОписаниеОповещения();
	КонецЕсли;

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("КонтейнерЗначения", КонтейнерЗначения);
	ПараметрыФормы.Вставить("КонтекстКлиента", УИ_ОбщегоНазначенияКлиентСервер.ТекущийКонтекстПлатформы());
	ПараметрыФормы.Вставить("Выражение", Выражение);

	Если НРег(КонтейнерЗначения.ОписаниеТипа.Имя) = "строка" Тогда
		ЗначениеСтроки = УИ_ОбщегоНазначенияКлиентСервер.ЗначениеИзХранилищаКонтейнераУниверсальногоЗначения(КонтейнерЗначения);
		ОткрытьФормуРедактированияТекста(ЗначениеСтроки, ОписаниеОповещенияДляФормы, Выражение, , Истина);
		Возврат;
	КонецЕсли;
	
	ВариантыФормы = ВариантыФормыПросмотраЗначения();
	Если ВариантФормы = ВариантыФормы.Значение Тогда
		ИмяФормыИнструмента = "Форма";
	ИначеЕсли ВариантФормы = ВариантыФормы.Коллекция Тогда
		ИмяФормыИнструмента = "Коллекция";
	Иначе
		Если КонтейнерЗначения.ОписаниеТипа.ЭтоКоллекция Тогда
			ИмяФормыИнструмента = "Коллекция";
		Иначе
			ИмяФормыИнструмента = "Форма";
		КонецЕсли;
	КонецЕсли;

	ОткрытьФорму("Обработка.УИ_ПросмотрЗначения.Форма." + ИмяФормыИнструмента,
				 ПараметрыФормы,
				 Форма,
				 Новый УникальныйИдентификатор,
				 ,
				 ,
				 ОписаниеОповещенияДляФормы,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры



Процедура ОткрытьФормуВыбораЭлементовСпискаЗначений(Список, ОписаниеОповещенияОЗакрытии, Заголовок = "",
	ТипЭлементов = Неопределено, ВидимостьПометки = Истина, ВидимостьПредставления = Истина, РежимПодбора = Истина,
	ВозвращатьТолькоВыбранныеЗначения = Истина, РежимОткрытия = Неопределено, ДоступныеЗначения = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Список", Список);
	ПараметрыФормы.Вставить("Заголовок", Заголовок);
	ПараметрыФормы.Вставить("ВозвращатьТолькоВыбранныеЗначения", ВозвращатьТолькоВыбранныеЗначения);
	ПараметрыФормы.Вставить("ВидимостьПометки", ВидимостьПометки);
	ПараметрыФормы.Вставить("ВидимостьПредставления", ВидимостьПредставления);
	ПараметрыФормы.Вставить("РежимПодбора", РежимПодбора);
	Если ТипЭлементов <> Неопределено Тогда
		ПараметрыФормы.Вставить("ТипЭлементов", ТипЭлементов);
	КонецЕсли;
	Если ДоступныеЗначения <> Неопределено Тогда
		ПараметрыФормы.Вставить("ДоступныеЗначения", ДоступныеЗначения);
	КонецЕсли;
	
	Если РежимОткрытия = Неопределено Тогда
		ОткрытьФорму("ОбщаяФорма.УИ_ФормаРедактированияСпискаЗначений", ПараметрыФормы, , , , ,
		ОписаниеОповещенияОЗакрытии);
	Иначе
		ОткрытьФорму("ОбщаяФорма.УИ_ФормаРедактированияСпискаЗначений", ПараметрыФормы, , , , ,
		ОписаниеОповещенияОЗакрытии, РежимОткрытия);
	КонецЕсли;
КонецПроцедуры

Процедура РедактироватьОбъект(СсылкаНаОбъект) Экспорт
	МассивТиповДоступныхДляРедактирования=УИ_ОбщегоНазначенияКлиентПовтИсп.ТипыОбъектовДоступныйДляРедактораОбъектовБазыДанных();
	Если МассивТиповДоступныхДляРедактирования.Найти(ТипЗнч(СсылкаНаОбъект)) = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("мОбъектСсылка", СсылкаНаОбъект);
	
	ОткрытьФорму("Обработка.УИ_РедакторРеквизитовОбъекта.Форма", ПараметрыФормы);
КонецПроцедуры

Процедура РедактироватьJSON(СтрокаJSON, РежимПросмотра, ОписаниеОповещенияОЗавершении = Неопределено) Экспорт
	СтруктураПараметров=Новый Структура;
	СтруктураПараметров.Вставить("СтрокаJSON", СтрокаJSON);
	СтруктураПараметров.Вставить("РежимПросмотра", РежимПросмотра);
	
	Если ОписаниеОповещенияОЗавершении = Неопределено Тогда
		ОткрытьФорму("Обработка.УИ_РедакторJSON.Форма", СтруктураПараметров);
	Иначе
		ОткрытьФорму("Обработка.УИ_РедакторJSON.Форма", СтруктураПараметров, , , , , ОписаниеОповещенияОЗавершении);
	КонецЕсли;
КонецПроцедуры

Процедура ОткрытьДинамическийСписок(ИмяОбъектаМетаданных, ОписаниеОповещенияОЗавершении = Неопределено) Экспорт
	СтрукПараметры = Новый Структура("ИмяОбъектаМетаданных", ИмяОбъектаМетаданных);
	
	Если ОписаниеОповещенияОЗавершении = Неопределено Тогда
		ОткрытьФорму("Обработка.УИ_ДинамическийСписок.Форма", СтрукПараметры, , ИмяОбъектаМетаданных);
	Иначе
		ОткрытьФорму("Обработка.УИ_ДинамическийСписок.Форма", СтрукПараметры, , ИмяОбъектаМетаданных, , ,
		ОписаниеОповещенияОЗавершении);
	КонецЕсли;
	
КонецПроцедуры

Процедура НайтиСсылкиНаОбъект(СсылкаНаОбъект) Экспорт
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ОбъектПоиска", СсылкаНаОбъект);
	
	ОткрытьФорму("Обработка.УИ_ПоискСсылокНаОбъект.Форма", ПараметрыФормы);
	
КонецПроцедуры

// Задать вопрос разработчику.
Процедура ЗадатьВопросРазработчику() Экспорт
	ОткрытьНавигационнуюСсылку("https://github.com/cpr1c/tools_ui_1c/issues");
КонецПроцедуры

// Открыть страницу разработки.
Процедура ОткрытьСтраницуРазработки() Экспорт
	ОткрытьНавигационнуюСсылку("https://github.com/cpr1c/tools_ui_1c");
КонецПроцедуры

// Открыть страницу особенностей отладки портативных инструметов.
Процедура ОткрытьСтраницуОсобенностейОтладкиПортативныхИнструметов() Экспорт
	ОткрытьНавигационнуюСсылку("https://github.com/cpr1c/tools_ui_1c/wiki/Особенности-использования-отладки-в-портативном-варианте");
КонецПроцедуры

Процедура ЗапуститьПроверкуОбновленияИнструментов() Экспорт
	ПараметрыФормы = Новый Структура;
	ОткрытьФорму("Обработка.УИ_ТехПоддержка.Форма.ОбновлениеИнструментов", ПараметрыФормы);
КонецПроцедуры

Процедура ОткрытьНовуюФормуИнструмента(ФормаНачальная)
	ОткрытьФорму(ФормаНачальная.ИмяФормы, , , Новый УникальныйИдентификатор, , , , РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры

Процедура СравнитьФайлыТабличныхДокументов(ПутьКФайлу1, ПутьКФайлу2, ЗаголовокЛевый = "Левый", ЗаголовокПравый = "Правый") Экспорт
	
	ПомещаемыеФайлы = Новый Массив;
	ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу1));
	ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу2));
	ПомещенныеФайлы = Новый Массив;
	Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда
		Возврат;
	КонецЕсли;
	ТабличныйДокументЛевый  = ПомещенныеФайлы[0].Хранение;
	ТабличныйДокументПравый = ПомещенныеФайлы[1].Хранение;
	
	СравнитьТабличныеДокументы(ТабличныйДокументЛевый, ТабличныйДокументПравый, ЗаголовокЛевый, ЗаголовокПравый);
	
КонецПроцедуры

Процедура СравнитьТабличныеДокументы(АдресТабличногоДокументаВоВременномХранилище1,
	АдресТабличногоДокументаВоВременномХранилище2, ЗаголовокЛевый = "Левый", ЗаголовокПравый = "Правый") Экспорт
	
	ТабличныеДокументыСтруктура = Новый Структура("Левый, Правый", АдресТабличногоДокументаВоВременномХранилище1,
	АдресТабличногоДокументаВоВременномХранилище2);
	АдресТабличныхДокументов = ПоместитьВоВременноеХранилище(ТабличныеДокументыСтруктура, Неопределено);
	
	ПараметрыОткрытияФормы = Новый Структура("АдресТабличныхДокументов, ЗаголовокЛевый, ЗаголовокПравый",
	АдресТабличныхДокументов, ЗаголовокЛевый, ЗаголовокПравый);
	ОткрытьФорму("ОбщаяФорма.УИ_СравнениеТабличныхДокументов", ПараметрыОткрытияФормы, ЭтотОбъект);
	
КонецПроцедуры

Функция ОткрытьИнформациюДляПоддержки() Экспорт
	Инфо = ИнформацияДляПоддержки();
	
	СтрокаДляВывода = ИнформацияДляПоддержкиСтрокой(Инфо);

	ОткрытьФормуРедактированияТекста(СтрокаДляВывода, Неопределено, "Информация для техподдержки");
КонецФункции

#Область ПодключаемыеМетодыКомандИнструментов

Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Форма, Команда) Экспорт
	Если Команда.Имя = "УИ_ОткрытьНовуюФормуИнструмента" Тогда
		ОткрытьНовуюФормуИнструмента(Форма);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область КомандыБСП

Процедура ДобавитьОбъектыКСравнению(МассивОбъектов, Контекст) Экспорт
	УИ_ОбщегоНазначенияКлиентСервер.ДобавитьМассивОбъектовКСравнению(МассивОбъектов);
КонецПроцедуры

Процедура ВыгрузитьОбъектыВXML(МассивОбъектов, Контекст) Экспорт
	АдресФайлаВоВременномХранилище="";
	УИ_ОбщегоНазначенияВызовСервера.ВыгрузитьОбъектыВXMLНаСервере(МассивОбъектов, АдресФайлаВоВременномХранилище,
	Контекст.Форма.УникальныйИдентификатор);
	
	Если ЭтоАдресВременногоХранилища(АдресФайлаВоВременномХранилище) Тогда
		ИмяФайла="Файл выгрузки.xml";
		ПолучитьФайл(АдресФайлаВоВременномХранилище, ИмяФайла);
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработчикКомандыРедактироватьОбъект(СсылкаНаОбъект, Контекст) Экспорт
	РедактироватьОбъект(СсылкаНаОбъект);
КонецПроцедуры

Процедура ОбработчикКомандыНайтиСсылкиНаОбъект(СсылкаНаОбъект, Контекст) Экспорт
	НайтиСсылкиНаОбъект(СсылкаНаОбъект);
КонецПроцедуры

Процедура ОткрытьНастройкиОтладкиДополнительнойОбработки(СсылкаНаОбъект) Экспорт
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ДополнительнаяОбработка", СсылкаНаОбъект);
	
	ОткрытьФорму("ОбщаяФорма.УИ_НастройкиОтладкиДополнительныхОбработок", ПараметрыФормы);
КонецПроцедуры

#КонецОбласти
#Область РедактированиеТиповИПеременные

#Область ПараметрыРедактированияТипов

// Новый параметры редактирования таблицы значений.
// 
// Возвращаемое значение:
//  Структура - Новый параметры редактирования таблицы значений:
// * СериализоватьВXML - Булево - Если Истина строковое представление ТЗ будет вычисляться через функции УИ_ОбщегоНазначения.ЗначениеИзСтрокиXML и УИ_ОбщегоНазначения.ЗначениеВСтрокуXML
// Если Ложь, то платформенными методами ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр
// * ТолькоПросмотр - Булево - Если Истина, таблица откроется только на просмотр
Функция НовыйПараметрыРедактированияТаблицыЗначений() Экспорт
	Структура = Новый Структура;
	Структура.Вставить("СериализоватьВXML", Ложь);
	Структура.Вставить("ТолькоПросмотр", Ложь);
	
	Возврат Структура;
КонецФункции

// Новый параметры редактирования списка значений.
// 
// Возвращаемое значение:
//  Структура -  Новый параметры редактирования списка значений:
// * Заголовок - Строка - 
// * ВозвращатьТолькоВыбранныеЗначения - Булево - 
// * ТипЭлементов - Неопределено, ОписаниеТипов, Строка - 
// * ВидимостьПометки - Булево - 
// * ВидимостьПредставления - Булево - 
// * РежимПодбора - Булево - 
// * ДоступныеЗначения - Неопределено, СписокЗначений Из Произвольный - 
// * РежимОткрытия - Неопределено, РежимОткрытияОкнаФормы - 
Функция НовыйПараметрыРедактированияСпискаЗначений() Экспорт
	ПараметрыРедактирования = Новый Структура;
	ПараметрыРедактирования.Вставить("Заголовок", "");
	ПараметрыРедактирования.Вставить("ВозвращатьТолькоВыбранныеЗначения", Истина);
	ПараметрыРедактирования.Вставить("ТипЭлементов", Неопределено);
	ПараметрыРедактирования.Вставить("ВидимостьПометки", Истина);
	ПараметрыРедактирования.Вставить("ВидимостьПредставления", Истина);
	ПараметрыРедактирования.Вставить("РежимПодбора", Истина);
	ПараметрыРедактирования.Вставить("ДоступныеЗначения", Неопределено);
	ПараметрыРедактирования.Вставить("РежимОткрытия", Неопределено);
	
	Возврат ПараметрыРедактирования;	
КонецФункции


#КонецОбласти

// Процедура - Редактировать тип
//
// Параметры:
//  ТипДанных						 - 	ОписаниеТипов, Неопределено - Текущий тип значения
//  РежимЗапуска					 - Число - режим запуска редактора типа
// 0- Выбор хранимых типов
// 1- типы для запроса
// 2- типы для поля СКД
// 3- типы для параметра СКД
// 4- Ссылочные типы без составных
//  СтандартнаяОбработка			 - Булево - Стандартная обработка события начало выбора
//  ВладелецФормы					 - 	 - 
//  ОписаниеОповещенияОЗавершении	 - 	 - 
//
Процедура РедактироватьТип(ТипДанных, РежимЗапуска, СтандартнаяОбработка, ВладелецФормы, ОписаниеОповещенияОЗавершении,
	НаборТипов = Неопределено) Экспорт
	СтандартнаяОбработка=Ложь;
	
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ТипДанных", ТипДанных);
	Если НаборТипов = Неопределено Тогда
		ПараметрыФормы.Вставить("РежимЗапуска", РежимЗапуска);
	Иначе
		ПараметрыФормы.Вставить("НаборТипов", НаборТипов);
	КонецЕсли;
	ОткрытьФорму("ОбщаяФорма.УИ_РедактированиеТипаЗначения",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

// Редактировать тип как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипа
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура ВыбратьТипЗначенияКакХранилищеКонтейнераТипа(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначенияТипа", ХранилищеКонтейнераЗначения);
	ПараметрыФормы.Вставить("НаборТипов", УИ_ОбщегоНазначенияКлиентСервер.ВсеНаборыТиповДляРедактирования());
	ПараметрыФормы.Вставить("ДоступенСоставнойТип", Ложь);
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	ОткрытьФорму("ОбщаяФорма.УИ_РедактированиеТипаЗначения",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

// Редактировать тип как хранилище контейнера описания типа.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипа
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьТипКакХранилищеКонтейнераОписанияТипа(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначенияОписанияТипа", ХранилищеКонтейнераЗначения);
	ПараметрыФормы.Вставить("НаборТипов", УИ_ОбщегоНазначенияКлиентСервер.ВсеНаборыТиповДляРедактирования());
	ОткрытьФорму("ОбщаяФорма.УИ_РедактированиеТипаЗначения",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

// Редактировать таблицу значений.
// 
// Параметры:
//  ТаблицаЗначенийСтрокой - Строка - Строковое представление таблицы значений
//  ВладелецФормы - ФормаКлиентскогоПриложения -
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Будет вызвано после закрытия формы
//  ПараметрыРедактирования - см. НовыйПараметрыРедактированияТаблицыЗначений 
Процедура РедактироватьТаблицуЗначений(ТаблицаЗначенийСтрокой, ВладелецФормы,
	ОписаниеОповещенияОЗавершении = Неопределено, ПараметрыРедактирования = Неопределено) Экспорт
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ТаблицаЗначенийСтрокой", ТаблицаЗначенийСтрокой);
	Если ПараметрыРедактирования <> Неопределено Тогда
		Для Каждого КлючЗначение Из ПараметрыРедактирования Цикл
			ПараметрыФормы.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение);
		КонецЦикла;
	КонецЕсли;
	
	ОткрытьФорму("ОбщаяФорма.УИ_РедакторТаблицыЗначений", ПараметрыФормы, ВладелецФормы, , , ,
	ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Редактировать таблицу значений как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТаблицыЗначений
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ВладелецФормы - Неопределено,ФормаКлиентскогоПриложения,ПолеФормы -  Владелец формы
Процедура РедактироватьТаблицуЗначенийКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторТаблицыЗначений",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Редактировать дерево значений как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияДереваЗначений
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ВладелецФормы - Неопределено,ФормаКлиентскогоПриложения,ПолеФормы -  Владелец формы
Процедура РедактироватьДеревоЗначенийКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы=Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначенияДерева", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторТаблицыЗначений",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
КонецПроцедуры

// Редактировать табличный документ.
// 
// Параметры:
//  ТабличныйДокумент - ТабличныйДокумент- Табличный документ
//  ЗаголовокФормы - Строка- Заголовок формы
//  ОписаниеОповещенияОЗавершении - Неопределено, ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -
Процедура РедактироватьТабличныйДокумент(ТабличныйДокумент, ЗаголовокФормы, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ИмяДокумента", ЗаголовокФормы);
	ПараметрыФормы.Вставить("ТабличныйДокумент", ТабличныйДокумент);
	ПараметрыФормы.Вставить("Редактирование", Истина);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторТабличногоДокумента", ПараметрыФормы, , , , , ОписаниеОповещенияОЗавершении);
	
КонецПроцедуры

// Редактировать табличный документ как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаТабличныйДокумент
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ВладелецФормы - Неопределено,ФормаКлиентскогоПриложения,ПолеФормы -  Владелец формы
Процедура РедактироватьТабличныйДокументКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);
	ПараметрыФормы.Вставить("Редактирование", Истина);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторТабличногоДокумента",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать момент времени.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаМоментВремени 
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -
Процедура РедактироватьМоментВремени(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторМоментаВремени",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать тип граница.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения -см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаГраница
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения - Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения,ПолеФормы -  Владелец формы
Процедура РедактироватьТипГраница(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторГраницы",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать тип структура.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаСтруктура
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьТипСтруктура(ХранилищеКонтейнераЗначения,ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторСтруктуры",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
		
КонецПроцедуры

// Редактировать тип соответствие.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаСоответствие
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьТипСоответствие(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторСоответствия",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать тип хранилище значения.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаХранилищеЗначения
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьТипХранилищеЗначенияКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторХранилищаЗначения",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
	
КонецПроцедуры

// Редактировать тип хранилище значения.
// 
// Параметры:
//  ХранилищеЗначения - ХранилищеЗначения
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -  Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьТипХранилищеЗначения(ХранилищеЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеЗначения", ХранилищеЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторХранилищаЗначения",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);
	
КонецПроцедуры

// Редактировать список значений как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаСписокЗначений
//  ОписаниеОповещенияОЗавершении- ОписаниеОповещения - Описание оповещения о закрытии
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьСписокЗначенийКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_ФормаСпискаЗначений",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры
	
// Редактировать массив как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаМассив
//  ОписаниеОповещенияОЗавершении- ОписаниеОповещения - Описание оповещения о закрытии
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьМассивКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначенияМассива", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_ФормаСпискаЗначений",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры
	
// Редактировать картинку.
// 
// Параметры:
//  Картинка- Картинка
//  ОписаниеОповещенияОЗавершении- ОписаниеОповещения - Описание оповещения о закрытии
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьКартинку(Картинка, ОписаниеОповещенияОЗавершении, ВладелецФормы = Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Картинка", Картинка);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторКартинки",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать картинку как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаКартинка
//  ОписаниеОповещенияОЗавершении- ОписаниеОповещения - Описание оповещения о закрытии
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьКартинкуКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторКартинки",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Редактировать двоичные данные как хранилище контейнера.
// 
// Параметры:
//  ХранилищеКонтейнераЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаДвоичныеДанные
//  ОписаниеОповещенияОЗавершении- ОписаниеОповещения - Описание оповещения о закрытии
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы -  Владелец формы
Процедура РедактироватьДвоичныеДанныеКакХранилищеКонтейнера(ХранилищеКонтейнераЗначения, ОписаниеОповещенияОЗавершении,
	ВладелецФормы = Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ХранилищеКонтейнераЗначения", ХранилищеКонтейнераЗначения);

	ОткрытьФорму("ОбщаяФорма.УИ_РедакторДвоичныхДанных",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении);

КонецПроцедуры

// Начать выбор ссылки редактирование специфичного значения.
// 
// Параметры:
//  Значение  - Произвольный -Значение
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения -Описание оповещения о завершении
//  ВладелецФормы - Неопределено, ФормаКлиентскогоПриложения, ПолеФормы - 
//  КонтейнерЗначения - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйКонтейнерЗначения
//  ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения - Булево
//  СтандартнаяОбработка - Булево
Процедура НачатьВыборСсылкиРедактированиеСпецифичногоЗначения(Значение, ОписаниеОповещенияОЗавершении, ВладелецФормы,
	КонтейнерЗначения = Неопределено, ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения = Ложь,
	СтандартнаяОбработка = Истина) Экспорт
	Если КонтейнерЗначения <> Неопределено Тогда
		СтандартнаяОбработка = Ложь;
		
		ТипыКонтейнеров = УИ_ОбщегоНазначенияКлиентСервер.ТипыКонтейнеровЗначения();		
		
		Если КонтейнерЗначения.Тип = ТипыКонтейнеров.Граница Тогда
			РедактироватьТипГраница(КонтейнерЗначения.Хранилище, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.МоментВремени Тогда
			РедактироватьМоментВремени(КонтейнерЗначения.Хранилище, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ТаблицаЗначений Тогда
			РедактироватьТаблицуЗначенийКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
															   ОписаниеОповещенияОЗавершении,
															   ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ДеревоЗначений Тогда
			РедактироватьДеревоЗначенийКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
															  ОписаниеОповещенияОЗавершении,
															  ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.Тип Тогда
			ВыбратьТипЗначенияКакХранилищеКонтейнераТипа(КонтейнерЗначения.Хранилище,
														 ОписаниеОповещенияОЗавершении,
														 ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ОписаниеТипов Тогда
			РедактироватьТипКакХранилищеКонтейнераОписанияТипа(КонтейнерЗначения.Хранилище,
															   ОписаниеОповещенияОЗавершении,
															   ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.Структура
				  Или КонтейнерЗначения.Тип = ТипыКонтейнеров.ФиксированнаяСтруктура Тогда
			РедактироватьТипСтруктура(КонтейнерЗначения.Хранилище, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.Соответствие
				  Или КонтейнерЗначения.Тип = ТипыКонтейнеров.ФиксированноеСоответствие Тогда
			РедактироватьТипСоответствие(КонтейнерЗначения.Хранилище, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ТабличныйДокумент Тогда
			РедактироватьТабличныйДокументКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
																 ОписаниеОповещенияОЗавершении,
																 ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ХранилищеЗначения Тогда
			РедактироватьТипХранилищеЗначенияКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
																	ОписаниеОповещенияОЗавершении,
																	ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.СписокЗначений Тогда
			РедактироватьСписокЗначенийКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
															  ОписаниеОповещенияОЗавершении,
															  ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.Массив
				  Или КонтейнерЗначения.Тип = ТипыКонтейнеров.ФиксированныйМассив Тогда
			РедактироватьМассивКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
													  ОписаниеОповещенияОЗавершении,
													  ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.Картинка Тогда
			РедактироватьКартинкуКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
														ОписаниеОповещенияОЗавершении,
														ВладелецФормы);
		ИначеЕсли КонтейнерЗначения.Тип = ТипыКонтейнеров.ДвоичныеДанные Тогда
			РедактироватьДвоичныеДанныеКакХранилищеКонтейнера(КонтейнерЗначения.Хранилище,
															  ОписаниеОповещенияОЗавершении,
															  ВладелецФормы);
		КонецЕсли;
	Иначе
		ТипЗначения = ТипЗнч(Значение);
		Если ТипЗначения = Тип("Строка") Тогда
			ОткрытьФормуРедактированияТекста(Значение, ОписаниеОповещенияОЗавершении);
		ИначеЕсли ТипЗначения = Тип("ХранилищеЗначения") Тогда
			РедактироватьТипХранилищеЗначения(Значение, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли УИ_ОбщегоНазначенияВызовСервера.ЭтоПеречислениеПоТипу(ТипЗначения) Тогда
			СтандартнаяОбработка = Ложь;
			НачатьВыборЗначенияПеречисления(Значение, ОписаниеОповещенияОЗавершении, ВладелецФормы);
		ИначеЕсли УИ_ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда
			СтандартнаяОбработка = Ложь;
			ИмяОбъекта = УИ_ОбщегоНазначения.ИмяТаблицыПоСсылке(Значение);
			Если ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения Тогда
				ПараметрыФормы = Новый Структура;
				ПараметрыФормы.Вставить("ИмяОбъектаМетаданных", ИмяОбъекта);
				ПараметрыФормы.Вставить("РежимВыбора", Истина);

				ОткрытьФорму("Обработка.УИ_ДинамическийСписок.Форма", ПараметрыФормы, ВладелецФормы);
			Иначе
				ОткрытьФорму(ИмяОбъекта + ".ФормаВыбора", , ВладелецФормы);
			КонецЕсли;

		ИначеЕсли ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда
			НачатьРедактированияУникальногоИдентификатора(Значение, ОписаниеОповещенияОЗавершении);
		КонецЕсли;

	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область КонтейнерЗначенияДляХраненияНаФорме

#КонецОбласти

#Область СобытияЭлементовФормы

// Новый базовые параметры обработчика события поля.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения- Форма
//  Элемент - ПолеФормы - Элемент
//  ИмяПоля - Строка - Имя поля в структуре формы
// 
// Возвращаемое значение:
//  Структура -  Новый базовые параметры обработчика события поля:
// * Форма - ФормаКлиентскогоПриложения
// * Элемент -ПолеФормы-Элемент
// * ДоступенКонтейнер - Булево - 
// * СтруктураХраненияЗначения -  Неопределено, ФормаКлиентскогоПриложения, ДанныеФормыСтруктура, ДанныеФормыЭлементДерева, ДанныеФормыЭлементКоллекции -  
// * ИмяПоляВСтруктуре - Строка - 
// * ИмяПоляКонтейнера - Строка, Неопределено - 
// * ИмяПоляТипаЗначения - Строка, Неопределено - 
// * ИмяПоляПредставленияТипаЗначения - Строка, Неопределено - 
// * ТекущееОписаниеТиповЗначения - Неопределено, ОписаниеТипов - 
Функция НовыйБазовыеПараметрыОбработчикаСобытияПоля(Форма, Элемент, ИмяПоля) Экспорт
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиентСервер.НовыйСтруктураХраненияРеквизитаНаФормеСКонейнером(ИмяПоля);
	ПараметрыОбработчика.Вставить("Форма", Форма);
	ПараметрыОбработчика.Вставить("Элемент", Элемент);
	ПараметрыОбработчика.Вставить("ДоступенКонтейнер", Ложь);
	ПараметрыОбработчика.Вставить("СтруктураХраненияЗначения", Неопределено);
	ПараметрыОбработчика.Вставить("ТекущееОписаниеТиповЗначения", Неопределено);

	Возврат ПараметрыОбработчика;
КонецФункции

// Новый параметры обработчика события начало выбора значения.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент -ПолеФормы-Элемент
//  ИмяПоля - Строка - Имя поля в структуре формы
// 
// Возвращаемое значение:
//  Структура -  Новый параметры обработчика события начало выбора значения:
// * Форма - ФормаКлиентскогоПриложения -
// * Элемент - ПолеФормы-
// * СтруктураХраненияЗначения - Неопределено, ФормаКлиентскогоПриложения, ДанныеФормыСтруктура, ДанныеФормыЭлементДерева, ДанныеФормыЭлементКоллекции - 
// * ИмяПоляВСтруктуре - Строка - Имя поля
// * ИмяПоляКонтейнера - Строка, Неопределено - 
// * ИмяПоляТипаЗначения - Строка, Неопределено - 
// * ИмяПоляПредставленияТипаЗначения - Строка, Неопределено - 
// * ДоступенКонтейнер - Булево 
// * Значение - Неопределено, Произвольный - 
// * ТекущееОписаниеТиповЗначения - Неопределено, ОписаниеТипов - 
// * НаборТипов - Строка, Неопределено - 
// * ОповещениеОВыбореПустогоЗначения - Неопределено, ОписаниеОповещения - 
// * ОповещениеОВыбореТипа - Неопределено, ОписаниеОповещения - 
// * ОповещениеОЗавершении - Неопределено, ОписаниеОповещения - 
Функция НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(Форма, Элемент, ИмяПоля) Экспорт
	ПараметрыОбработчика = НовыйБазовыеПараметрыОбработчикаСобытияПоля(Форма, Элемент, ИмяПоля);
	ПараметрыОбработчика.Вставить("Значение", Неопределено);
	ПараметрыОбработчика.Вставить("НаборТипов", Неопределено);
	ПараметрыОбработчика.Вставить("ОповещениеОВыбореПустогоЗначения", Неопределено);
	ПараметрыОбработчика.Вставить("ОповещениеОВыбореТипа", Неопределено);
	ПараметрыОбработчика.Вставить("ОповещениеОЗавершении", Неопределено);
	
	Возврат ПараметрыОбработчика;
КонецФункции

// Новый параметры обработчика события очистка.
// 
// Параметры:
//  Форма -ФормаКлиентскогоПриложения-Форма
//  Элемент -ПолеФормы-Элемент
//  ИмяПоля - Строка - Имя поля в структуре формы
// 
// Возвращаемое значение:
// см. НовыйБазовыеПараметрыОбработчикаСобытияПоля
Функция НовыйПараметрыОбработчикаСобытияОчистка(Форма, Элемент, ИмяПоля) Экспорт
	ПараметрыОбработчика = НовыйБазовыеПараметрыОбработчикаСобытияПоля(Форма, Элемент, ИмяПоля);

	Возврат ПараметрыОбработчика;
	
КонецФункции

// Новый параметры обработчика события при изменении.
// 
// Параметры:
//  Форма -ФормаКлиентскогоПриложения-Форма
//  Элемент -ПолеФормы-Элемент
//  ИмяПоля - Строка - Имя поля в структуре формы
// 
// Возвращаемое значение:
// см. НовыйБазовыеПараметрыОбработчикаСобытияПоля
Функция НовыйПараметрыОбработчикаСобытияПриИзменении(Форма, Элемент, ИмяПоля) Экспорт
	ПараметрыОбработчика = НовыйБазовыеПараметрыОбработчикаСобытияПоля(Форма, Элемент, ИмяПоля);

	Возврат ПараметрыОбработчика;
	
КонецФункции

// Поле формы обработчик очистка.
// 
// Параметры:
//  ПараметрыОбработчика - см. НовыйПараметрыОбработчикаСобытияОчистка
//  СтандартнаяОбработка -Булево-Стандартная обработка
Процедура ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка) Экспорт
//	НовоеОписаниеТипов = Новый ОписаниеТипов;

	НовоеЗначение = Неопределено;
	Если ПараметрыОбработчика.ТекущееОписаниеТиповЗначения <> Неопределено Тогда
	//	НовоеОписаниеТипов = ПараметрыОбработчика.ТекущееОписаниеТиповЗначения;
		НовоеЗначение = УИ_ОбщегоНазначенияКлиентСервер.ПустоеЗначениеТипа(ПараметрыОбработчика.ТекущееОписаниеТиповЗначения);
	КонецЕсли;
		
	Если ПараметрыОбработчика.ДоступенКонтейнер Тогда
		УИ_ОбщегоНазначенияКлиентСервер.УстановитьЗначениеПоляСКонтейнером(ПараметрыОбработчика.СтруктураХраненияЗначения,
																		   ПараметрыОбработчика,
																		   НовоеЗначение);
	Иначе
		ПараметрыОбработчика.Элемент.ОграничениеТипа = Новый ОписаниеТипов;

		ПараметрыОбработчика.СтруктураХраненияЗначения[ПараметрыОбработчика.ИмяПоляВСтруктуре] = НовоеЗначение;
	КонецЕсли;

КонецПроцедуры

// Поле формы обработчик при изменении.
// 
// Параметры:
//  ПараметрыОбработчика -см. НовыйПараметрыОбработчикаСобытияПриИзменении
Процедура ПолеФормыОбработчикПриИзменении(ПараметрыОбработчика) Экспорт
	Если Не ПараметрыОбработчика.ДоступенКонтейнер Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеКонтейнера = ПараметрыОбработчика.СтруктураХраненияЗначения[ПараметрыОбработчика.ИмяПоляКонтейнера];//см. УИ_ОбщегоНазначенияКлиентСервер.НовыйКонтейнерЗначения
	Если ЗначениеКонтейнера = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОбработчика.СтруктураХраненияЗначения[ПараметрыОбработчика.ИмяПоляВСтруктуре] = ЗначениеКонтейнера.Представление;
КонецПроцедуры

// Поле формы обработчик начало выбора значения.
// 
// Параметры:
//  ПараметрыОбработчика -см. НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения
//  СтандартнаяОбработка - Булево
Процедура ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка) Экспорт
	Значение = ПараметрыОбработчика.СтруктураХраненияЗначения[ПараметрыОбработчика.ИмяПоляВСтруктуре];
	ЗначениеКонтейнера = Неопределено;

	Если ПараметрыОбработчика.ДоступенКонтейнер Тогда
		ЗначениеКонтейнера = ПараметрыОбработчика.СтруктураХраненияЗначения[ПараметрыОбработчика.ИмяПоляКонтейнера];
	КонецЕсли;
	Если ПараметрыОбработчика.ДоступенКонтейнер И ЗначениеКонтейнера <> Неопределено Тогда
		ОписаниеЗавершенияВыбораЗначения = Новый ОписаниеОповещения("ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораЗначения",
			ЭтотОбъект, ПараметрыОбработчика);
		НачатьВыборСсылкиРедактированиеСпецифичногоЗначения(Значение,
															ОписаниеЗавершенияВыбораЗначения,
															ПараметрыОбработчика.Элемент,
															ЗначениеКонтейнера,
															,
															СтандартнаяОбработка);

	ИначеЕсли Значение = Неопределено Тогда
		СтандартнаяОбработка = Ложь;

		ОписаниеОповещенияЗавершенияВыбораТипа = Новый ОписаниеОповещения("ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораТипа",
			ЭтотОбъект, ПараметрыОбработчика);

		ПараметрыФормы=Новый Структура;
		ПараметрыФормы.Вставить("ДоступенСоставнойТип", Ложь);
		ПараметрыФормы.Вставить("РежимВыбора", Истина);
		Если ПараметрыОбработчика.НаборТипов = Неопределено Тогда
			ПараметрыФормы.Вставить("НаборТипов", "Ссылки,Примитивные,УНИКАЛЬНЫЙИДЕНТИФИКАТОР");
		Иначе
			ПараметрыФормы.Вставить("НаборТипов", ПараметрыОбработчика.НаборТипов);
		КонецЕсли;

		Если ПараметрыОбработчика.ТекущееОписаниеТиповЗначения <> Неопределено Тогда
			МассивТипов = ПараметрыОбработчика.ТекущееОписаниеТиповЗначения.Типы();
			Если МассивТипов.Количество() = 1 Тогда
				РезультатВыбораТипов = Новый Структура;
				РезультатВыбораТипов.Вставить("Описание", ПараметрыОбработчика.ТекущееОписаниеТиповЗначения);
				РезультатВыбораТипов.Вставить("ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения", Ложь);

				ВыполнитьОбработкуОповещения(ОписаниеОповещенияЗавершенияВыбораТипа, РезультатВыбораТипов);
				Возврат;
			КонецЕсли;
			
			ПараметрыФормы.Вставить("ОграничениеТипа", ПараметрыОбработчика.ТекущееОписаниеТиповЗначения);
		КонецЕсли;


		ОткрытьФорму("ОбщаяФорма.УИ_РедактированиеТипаЗначения",
					 ПараметрыФормы,
					 ПараметрыОбработчика.Элемент,
					 ,
					 ,
					 ,
					 ОписаниеОповещенияЗавершенияВыбораТипа,
					 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	Иначе//Если ПараметрыОбработчика.Элемент.ОграничениеТипа <> Новый ОписаниеТипов Тогда
		ОписаниеЗавершенияВыбораЗначения = Новый ОписаниеОповещения("ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораЗначения",
			ЭтотОбъект, ПараметрыОбработчика);
		НачатьВыборСсылкиРедактированиеСпецифичногоЗначения(Значение,
															ОписаниеЗавершенияВыбораЗначения,
															ПараметрыОбработчика.Элемент,
															,
															,
															СтандартнаяОбработка);
	КонецЕсли;

КонецПроцедуры

// Поле формы обработчик начало выбора значения завершение выбора типа.
// 
// Параметры:
//  Результат - Структура:
//  * Описание - ОписаниеТипов
//  * ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения - Булево
//  ДополнительныеПараметры -см. НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения
Процедура ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораТипа(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Результат.Описание.Типы().Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.Форма.Модифицированность = Истина;
	
	ТипЗначения = Результат.Описание.Типы()[0];

	ИмяПоляТипаЗначения = ДополнительныеПараметры.ИмяПоляТипаЗначения;
	ИмяПоляПредставленияТипаЗначения = ДополнительныеПараметры.ИмяПоляПредставленияТипаЗначения;
	ИмяПоляКонтейнера = ДополнительныеПараметры.ИмяПоляКонтейнера;

	ХранитьВКонтейнере = УИ_ОбщегоНазначенияКлиентСервер.ХранитьТипВКонтейнере(ТипЗначения);

	Если ХранитьВКонтейнере И Не ДополнительныеПараметры.ДоступенКонтейнер Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Данное поле не поддерживает данный тип");
		Возврат;
	КонецЕсли;

	//ДополнительныеПараметры.ТекущееОписаниеТиповЗначения = Результат.Описание;

	ОписаниеТиповДляПустогоЗначения = Результат.Описание;

	Если ДополнительныеПараметры.ДоступенКонтейнер Тогда

		Если ХранитьВКонтейнере Тогда
			ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляТипаЗначения] = УИ_ОбщегоНазначенияКлиентСервер.ОписаниеТипаСтрока(100);

			ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляКонтейнера] = УИ_ОбщегоНазначенияКлиентСервер.НовыйКонтейнерЗначенияПоТипу(ТипЗначения);

		Иначе
			ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляТипаЗначения] = Результат.Описание;

		КонецЕсли;
		ОписаниеТиповДляПустогоЗначения = ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляТипаЗначения];
		
		ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляПредставленияТипаЗначения] = Строка(Результат.Описание);
	Иначе
		ДополнительныеПараметры.Элемент.ОграничениеТипа = ОписаниеТиповДляПустогоЗначения;
	КонецЕсли;

	ПустоеЗначениеТипа = УИ_ОбщегоНазначенияКлиентСервер.ПустоеЗначениеТипа(ТипЗначения, ХранитьВКонтейнере);
	ДополнительныеПараметры.СтруктураХраненияЗначения[ДополнительныеПараметры.ИмяПоляВСтруктуре] = ПустоеЗначениеТипа;
		
	Если ТипЗначения = Тип("Число")
		 Или ТипЗначения = Тип("Строка")
		 Или ТипЗначения = Тип("Дата")
		 Или ТипЗначения = Тип("Булево") Тогда
		Возврат;
	КонецЕсли;

	ОписаниеЗавершенияВыбораЗначения = Новый ОписаниеОповещения("ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораЗначения",
		ЭтотОбъект, ДополнительныеПараметры);
	
	Если ДополнительныеПараметры.ДоступенКонтейнер Тогда
		НачатьВыборСсылкиРедактированиеСпецифичногоЗначения(ПустоеЗначениеТипа,
															ОписаниеЗавершенияВыбораЗначения,
															ДополнительныеПараметры.Элемент,
															ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляКонтейнера],
															Результат.ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения);
	Иначе
		НачатьВыборСсылкиРедактированиеСпецифичногоЗначения(ПустоеЗначениеТипа,
															ОписаниеЗавершенияВыбораЗначения,
															ДополнительныеПараметры.Элемент,
															,
															Результат.ИспользоватьДинамическийСписокДляВыбораСсылочногоЗначения);
	КонецЕсли;
	
	
КонецПроцедуры

// Поле формы обработчик начало выбора значения завершение выбора значения.
// 
// Параметры:
//  Результат -Произвольный, Неопределено-Результат
//  ДополнительныеПараметры - см. НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения
Процедура ПолеФормыОбработчикНачалоВыбораЗначенияЗавершениеВыбораЗначения(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ДополнительныеПараметры.Форма.Модифицированность = Истина;
	
	ИмяПоляКонтейнера = ДополнительныеПараметры.ИмяПоляКонтейнера;
		
	Если ДополнительныеПараметры.ДоступенКонтейнер Тогда
		ТекущееЗначениеКонтейнера = ДополнительныеПараметры.СтруктураХраненияЗначения[ИмяПоляКонтейнера]; //см. УИ_ОбщегоНазначенияКлиентСервер.НовыйКонтейнерЗначения
		Если ТекущееЗначениеКонтейнера <> Неопределено Тогда
			ТекущееЗначениеКонтейнера.Хранилище = Результат;
			УИ_ОбщегоНазначенияКлиентСервер.УстановитьПредставлениеКонтейнера(ТекущееЗначениеКонтейнера);

			ДополнительныеПараметры.СтруктураХраненияЗначения[ДополнительныеПараметры.ИмяПоляВСтруктуре] = ТекущееЗначениеКонтейнера.Представление;
		Иначе
			ДополнительныеПараметры.СтруктураХраненияЗначения[ДополнительныеПараметры.ИмяПоляВСтруктуре] = Результат;
		КонецЕсли;
	Иначе
		ДополнительныеПараметры.СтруктураХраненияЗначения[ДополнительныеПараметры.ИмяПоляВСтруктуре] = Результат;
	КонецЕсли;
	
	Если ТипЗнч(ДополнительныеПараметры.ОповещениеОЗавершении) = Тип("ОписаниеОповещения") Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении);
	КонецЕсли;
КонецПроцедуры


Процедура ПолеФормыИмяФайлаНачалоВыбора(СтруктураОписанияФайла, Элемент, ДанныеВыбора, СтандартнаяОбработка,
	РежимДиалога, ОписаниеОповещенияОЗавершении) Экспорт
	СтандартнаяОбработка=Ложь;
	
	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("Элемент", Элемент);
	ДополнительныеПараметрыОповещения.Вставить("СтруктураОписанияФайла", СтруктураОписанияФайла);
	ДополнительныеПараметрыОповещения.Вставить("РежимДиалога", РежимДиалога);
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);

	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("ПолеФормыИмяФайлаНачалоВыбораЗавершениеПодключенияРасширенияРаботыСФайлами",
		ЭтотОбъект, ДополнительныеПараметрыОповещения));
КонецПроцедуры

Процедура ПолеФормыИмяФайлаНачалоВыбораЗавершениеПодключенияРасширенияРаботыСФайлами(Подключено,
	ДополнительныеПараметры) Экспорт
	ВыборФайла = ДиалогВыбораФайлаПоСтруктуреОписанияВыбираемогоФайла(ДополнительныеПараметры.РежимДиалога,
	ДополнительныеПараметры.СтруктураОписанияФайла);
	ВыборФайла.Показать(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
КонецПроцедуры

#КонецОбласти

#Область ВспомогательныеБиблиотекиИнструментов

Процедура СохранитьВспомогательныеБиблиотекиНаКлиентеПриНачалеРаботыСистемы() Экспорт
	КаталогБиблиотек=КаталогВспомогательныхБиблиотекИнструментов();
	
	//1. очищаем наш каталог. Под каждую базу он свой
	Сообщить(КаталогБиблиотек);
КонецПроцедуры

// Каталог вспомогательных библиотек инструментов.
// 
// Возвращаемое значение:
//  Строка - Каталог вспомогательных библиотек инструментов
Функция КаталогВспомогательныхБиблиотекИнструментов() Экспорт
	СтруктураФайловыхПеременных=СтруктураФайловыхПеременныхСеанса();
	Если Не СтруктураФайловыхПеременных.Свойство("РабочийКаталогДанныхПользователя") Тогда
		Возврат "";
	КонецЕсли;
	
	Возврат УИ_ОбщегоНазначенияКлиентСервер.КаталогВспомогательныхБиблиотекИнструментов(
	СтруктураФайловыхПеременных.РабочийКаталогДанныхПользователя);
КонецФункции


#КонецОбласти

#Область ХранилищеЗначения

Процедура РедактироватьХранилищеЗначения(Форма, АдресВременногоХранилищаЗначенияИлиЗначение,
	ОписаниеОповещения = Неопределено) Экспорт
	
	Если ОписаниеОповещения = Неопределено Тогда
		ПараметрыОписанияОповещения = Новый Структура;
		ПараметрыОписанияОповещения.Вставить("Форма", Форма);
		ПараметрыОписанияОповещения.Вставить("АдресВременногоХранилищаЗначенияИлиЗначение",
		АдресВременногоХранилищаЗначенияИлиЗначение);
		ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("РедактироватьХранилищеЗначенияЗавершение", ЭтотОбъект,
		ПараметрыОписанияОповещения);
	Иначе
		ОписаниеОповещенияОЗакрытии = ОписаниеОповещения;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ДанныеХЗ", АдресВременногоХранилищаЗначенияИлиЗначение);
	
	ОткрытьФорму("ОбщаяФорма.УИ_ФормаХранилищаЗначения",
				 ПараметрыФормы,
				 Форма,
				 Форма.УникальныйИдентификатор,
				 ,
				 ,
				 ОписаниеОповещенияОЗакрытии,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

Процедура РедактироватьХранилищеЗначенияЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	//	Форма=ДополнительныеПараметры.Форма;
КонецПроцедуры

#КонецОбласти

#Область ПараметрыЗаписи

Процедура РедактироватьПараметрыЗаписи(Форма) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПараметрыЗаписи", УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(Форма));
	
	Если Форма.ИмяФормы = "Обработка.УИ_РедакторРеквизитовОбъекта.Форма.ФормаОбъекта" Тогда
		МассивТипа = Новый Массив;
		МассивТипа.Добавить(ТипЗнч(Форма.мОбъектСсылка));
		
		ПараметрыФормы.Вставить("ТипОбъекта", Новый ОписаниеТипов(МассивТипа));
	КонецЕсли;
	
	ПараметрыОписанияОповещения = Новый Структура;
	ПараметрыОписанияОповещения.Вставить("Форма", Форма);
	ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("РедактироватьПараметрыЗаписиЗавершение", ЭтотОбъект,
	ПараметрыОписанияОповещения);
	
	ОткрытьФорму("ОбщаяФорма.УИ_ПараметрыЗаписи", ПараметрыФормы, Форма, , , , ОписаниеОповещенияОЗакрытии,
	РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

Процедура РедактироватьПараметрыЗаписиЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Форма = ДополнительныеПараметры.Форма;
	
	УИ_ОбщегоНазначенияКлиентСервер.УстановитьПараметрыЗаписиНаФорму(Форма, Результат);
КонецПроцедуры

#КонецОбласти

#Область СохранениеЧтениеДанныхКонсолей
#Область СохранениеДанныхКонсолей

// Описание
// 
// Параметры:
// 	СохранитьКак - Булево - Включен ли режим сохранения файла КАК. Т.е. всегда запрашивать куда сохранять, даже если уже есть имяфайла
// 	СтруктураОписанияСохраняемогоФайла -Структура - Содержит информацию, необходимую для идентификации файла, куда сохранять
// 		Содержит поля:
// 			ИмяФайла- Строка - Имя сохраняемого файла. Если не указано покажется диалог для сохранения
// 			Расширение- Строка- Расширение сохраняемого файла
// 			ИмяСохраняемогоФормата- Строка- описание формата сохраняемого файла
// 	АдресДанныхСохранения - Строка- Адрес во временном хранилище с сохраняемым значением. Сохраняемые данные будут дополнительно сериализованы с использованием сериализатора JSON
// 	ОписаниеОповещенияОЗавершении- ОписаниеОповещения- Описание оповещения после сохранения данных в файл
Процедура СохранитьДанныеКонсолиВФайл(ИмяКонсоли, СохранитьКак, СтруктураОписанияСохраняемогоФайла,
	АдресДанныхСохранения, ОписаниеОповещенияОЗавершении) Экспорт
	
	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("СохранитьКак", СохранитьКак);
	ДополнительныеПараметрыОповещения.Вставить("СтруктураОписанияСохраняемогоФайла", СтруктураОписанияСохраняемогоФайла);
	ДополнительныеПараметрыОповещения.Вставить("АдресДанныхСохранения", АдресДанныхСохранения);
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ДополнительныеПараметрыОповещения.Вставить("ИмяКонсоли", ИмяКонсоли);

	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("СохранитьДанныеКонсолиВФайлПослеПодключенияРасширенияРаботыСФайлами",
		ЭтотОбъект, ДополнительныеПараметрыОповещения));

КонецПроцедуры

Процедура СохранитьДанныеКонсолиВФайлПослеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
	СохранитьКак = ДополнительныеПараметры.СохранитьКак;
	СтруктураОписанияСохраняемогоФайла=ДополнительныеПараметры.СтруктураОписанияСохраняемогоФайла;
	
	Если СохранитьКак Или СтруктураОписанияСохраняемогоФайла.ИмяФайла = "" Тогда
		ВыборФайла = ДиалогВыбораФайлаПоСтруктуреОписанияВыбираемогоФайла(РежимДиалогаВыбораФайла.Сохранение,
																		  СтруктураОписанияСохраняемогоФайла);
		ВыборФайла.Показать(Новый ОписаниеОповещения("СохранитьДанныеКонсолиВФайлПослеВыбораИмениФайла", ЭтотОбъект,
			ДополнительныеПараметры));
	Иначе
		СохранитьДанныеКонсолиВФайлНачатьПолучениеФайла(СтруктураОписанияСохраняемогоФайла.ИмяФайла,
														ДополнительныеПараметры);
	КонецЕсли;
	
КонецПроцедуры

Процедура СохранитьДанныеКонсолиВФайлПослеВыбораИмениФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	СохранитьДанныеКонсолиВФайлНачатьПолучениеФайла(ВыбранныеФайлы[0], ДополнительныеПараметры);
КонецПроцедуры

Процедура СохранитьДанныеКонсолиВФайлНачатьПолучениеФайла(ИмяФайла, ДополнительныеПараметры) Экспорт

	ПодготовленныеДанныеДляЗаписи=УИ_ОбщегоНазначенияВызовСервера.ПодготовленныеДанныеКонсолиДляЗаписиВФайл(ДополнительныеПараметры.ИмяКонсоли,
																											ИмяФайла,
																											ДополнительныеПараметры.АдресДанныхСохранения,
																											ДополнительныеПараметры.СтруктураОписанияСохраняемогоФайла);
	ПолучаемыеФайлы = Новый Массив;
	ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ПодготовленныеДанныеДляЗаписи));
	НачатьПолучениеФайлов(Новый ОписаниеОповещения("СохранитьДанныеКонсолиВФайлПослеПолученияФайлов", ЭтотОбъект,
		ДополнительныеПараметры), ПолучаемыеФайлы, ИмяФайла, Ложь);
КонецПроцедуры

Процедура СохранитьДанныеКонсолиВФайлПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	
	ОбработкаОповещения = ДополнительныеПараметры.ОписаниеОповещенияОЗавершении;
	
	Если ПолученныеФайлы = Неопределено Тогда
		
		Если ОбработкаОповещения <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(ОбработкаОповещения, Неопределено);
		КонецЕсли;
	Иначе
		Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.13") Тогда
			ИмяФайла = ПолученныеФайлы[0].ПолноеИмя;
		Иначе
			ИмяФайла = ПолученныеФайлы[0].Имя;
		КонецЕсли;
		Если ОбработкаОповещения <> Неопределено Тогда
			ВыполнитьОбработкуОповещения(ОбработкаОповещения, ИмяФайла);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ЧтениеДанныхКонсолей

Процедура ПрочитатьДанныеКонсолиИзФайла(ИмяКонсоли, СтруктураОписанияЧитаемогоФайла, ОписаниеОповещенияОЗавершении,
	БезВыбораФайла = Ложь) Экспорт

	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("СтруктураОписанияЧитаемогоФайла", СтруктураОписанияЧитаемогоФайла);
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ДополнительныеПараметрыОповещения.Вставить("ИмяКонсоли", ИмяКонсоли);
	ДополнительныеПараметрыОповещения.Вставить("БезВыбораФайла", БезВыбораФайла);

	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("ПрочитатьДанныеКонсолиИзФайлаПослеПодключенияРасширения",
		ЭтотОбъект, ДополнительныеПараметрыОповещения));
	
КонецПроцедуры

Процедура ПрочитатьДанныеКонсолиИзФайлаПослеПодключенияРасширения(Подключено, ДополнительныеПараметры) Экспорт
	
	ЗагружаемоеИмяФайла = ДополнительныеПараметры.СтруктураОписанияЧитаемогоФайла.ИмяФайла;
	БезВыбораФайла = ДополнительныеПараметры.БезВыбораФайла;

	Если Подключено Тогда

		Если БезВыбораФайла Тогда
			Если ЗначениеЗаполнено(ЗагружаемоеИмяФайла) Тогда
				ПомещаемыеФайлы=Новый Массив;
				ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ЗагружаемоеИмяФайла));

				НачатьПомещениеФайлов(Новый ОписаниеОповещения("ПрочитатьДанныеКонсолиИзФайлаПослеПомещенияФайлов",
					ЭтотОбъект, ДополнительныеПараметры), ПомещаемыеФайлы, , Ложь);
			КонецЕсли;
		Иначе
			ВыборФайла = ДиалогВыбораФайлаПоСтруктуреОписанияВыбираемогоФайла(РежимДиалогаВыбораФайла.Открытие,
																			  ДополнительныеПараметры.СтруктураОписанияЧитаемогоФайла);

			ВыборФайла.Показать(Новый ОписаниеОповещения("ПрочитатьДанныеКонсолиИзФайлаПослеВыбораФайла", ЭтотОбъект,
				ДополнительныеПараметры));
		КонецЕсли;
	Иначе
		ПомещаемыеФайлы=Новый Массив;
		ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ЗагружаемоеИмяФайла));

		НачатьПомещениеФайлов(Новый ОписаниеОповещения("ПрочитатьДанныеКонсолиИзФайлаПослеПомещенияФайлов", ЭтотОбъект,
			ДополнительныеПараметры), ПомещаемыеФайлы, , ЗагружаемоеИмяФайла = "");

	КонецЕсли;
	
КонецПроцедуры

Процедура ПрочитатьДанныеКонсолиИзФайлаПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПомещаемыеФайлы=Новый Массив;
	ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ВыбранныеФайлы[0]));
	
	НачатьПомещениеФайлов(
	Новый ОписаниеОповещения("ПрочитатьДанныеКонсолиИзФайлаПослеПомещенияФайлов", ЭтотОбъект,
	ДополнительныеПараметры), ПомещаемыеФайлы, , Ложь);
КонецПроцедуры

Процедура ПрочитатьДанныеКонсолиИзФайлаПослеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ПомещенныеФайлы = Неопределено Тогда
		Возврат;
		
	КонецЕсли;
	
	ПрочитатьДанныеКонсолиИзФайлаОтработкаЗагрузкиФайла(ПомещенныеФайлы, ДополнительныеПараметры);
КонецПроцедуры

Процедура ПрочитатьДанныеКонсолиИзФайлаОтработкаЗагрузкиФайла(ПомещенныеФайлы, ДополнительныеПараметры)
	
	СтруктураРезультата=Неопределено;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
		
		Если ПомещенныйФайл.Хранение <> "" Тогда
			
			СтруктураРезультата=Новый Структура;
			СтруктураРезультата.Вставить("Адрес", ПомещенныйФайл.Хранение);
			Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.13") Тогда
				СтруктураРезультата.Вставить("ИмяФайла", ПомещенныйФайл.ПолноеИмя);
			Иначе
				СтруктураРезультата.Вставить("ИмяФайла", ПомещенныйФайл.Имя);
			КонецЕсли;
			
			Прервать;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, СтруктураРезультата);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ПодключениеИУстановкаРасширенияРаботыСФайлами

Процедура ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(ОписаниеОповещенияОЗавершении, ПослеУстановки = Ложь) Экспорт
	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ДополнительныеПараметрыОповещения.Вставить("ПослеУстановки", ПослеУстановки);

	Если Не УИ_ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда
		ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеПодключенияРасширения(Истина,
																							  ДополнительныеПараметрыОповещения);
		Возврат;
	КонецЕсли;
	
	НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеПодключенияРасширения",
		ЭтотОбъект, ДополнительныеПараметрыОповещения));
	
КонецПроцедуры

Процедура ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеПодключенияРасширения(Подключено,
	ДополнительныеПараметры) Экспорт
	
	Если Подключено Тогда
		СтруктураФайловыхПеременныхСеанса=УИ_ПараметрыПриложения[ИмяПараметраФайловыхПеременныхСеанса()];
		Если СтруктураФайловыхПеременныхСеанса = Неопределено Тогда
			ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложения(Новый ОписаниеОповещения("ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеЧтенияФайловыхПеременныхСеанса",
				ЭтотОбъект, ДополнительныеПараметры));
		ИначеЕсли Не СтруктураФайловыхПеременныхСеанса.Свойство("РабочийКаталогДанныхПользователя") Тогда
			ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложения(Новый ОписаниеОповещения("ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеЧтенияФайловыхПеременныхСеанса",
				ЭтотОбъект, ДополнительныеПараметры));
		Иначе
			ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
		КонецЕсли;
	ИначеЕсли Не ДополнительныеПараметры.ПослеУстановки Тогда
		НачатьУстановкуРасширенияРаботыСФайлами(Новый ОписаниеОповещения("ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеУстановкиРасширения",
			ЭтотОбъект, ДополнительныеПараметры));
	Иначе
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Ложь);
	КонецЕсли;
	
КонецПроцедуры

Процедура ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеЧтенияФайловыхПеременныхСеанса(Результат,
	ДополнительныеПараметры) Экспорт
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
	
КонецПроцедуры

Процедура ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкойЗавершениеУстановкиРасширения(ДополнительныеПараметры) Экспорт
	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении,
	Истина);
КонецПроцедуры

#КонецОбласти

#Область ПараметрыПриложения

Функция НомерСеанса() Экспорт
	Возврат УИ_ПараметрыПриложения["НомерСеанса"];
КонецФункции

#КонецОбласти

#Область ЧтениеФайловыхПараметровСеансаВПараметрыПриложения

Функция ИмяПараметраФайловыхПеременныхСеанса() Экспорт
	Возврат "ФАЙЛОВЫЕ_ПЕРЕМЕННЫЕ";
КонецФункции

// Структура файловых переменных сеанса.
// 
// Возвращаемое значение:
//  Структура - Файловые переменные сеанса:
//  	* КаталогВременныхФайлов - Строка - 
//  	* РабочийКаталогДанныхПользователя - Строка -
Функция СтруктураФайловыхПеременныхСеанса() Экспорт
	ТекущиеПараметрыПриложения=УИ_ПараметрыПриложения;
	
	СтруктураФайловыхПеременных=ТекущиеПараметрыПриложения[ИмяПараметраФайловыхПеременныхСеанса()];
	Если СтруктураФайловыхПеременных = Неопределено Тогда
		ТекущиеПараметрыПриложения[ИмяПараметраФайловыхПеременныхСеанса()]=Новый Структура;
		СтруктураФайловыхПеременных=ТекущиеПараметрыПриложения[ИмяПараметраФайловыхПеременныхСеанса()];
	КонецЕсли;
	
	Возврат СтруктураФайловыхПеременных;
КонецФункции

Процедура ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложения(ОписаниеОповещенияОЗавершении) Экспорт
	ДополнительныеПараметрыОповещения=Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	
	//1. каталог временных файлов
	НачатьПолучениеКаталогаВременныхФайлов(
	Новый ОписаниеОповещения("ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложенияПолучениеКаталогаВременныхФайловЗавершение",
	ЭтотОбъект, ДополнительныеПараметрыОповещения));
КонецПроцедуры

Процедура ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложенияПолучениеКаталогаВременныхФайловЗавершение(ИмяКаталога,
	ДополнительныеПараметры) Экспорт
	СтруктураФайловыхПеременных=СтруктураФайловыхПеременныхСеанса();
	СтруктураФайловыхПеременных.Вставить("КаталогВременныхФайлов", ИмяКаталога);
	
	НачатьПолучениеРабочегоКаталогаДанныхПользователя(
	Новый ОписаниеОповещения("ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложенияПолучениеРабочегоКаталогаДанныхПользователяЗавершение",
	ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры

Процедура ПрочитатьОсновныеФайловыеПеременныеСеансаВПараметрыПриложенияПолучениеРабочегоКаталогаДанныхПользователяЗавершение(ИмяКаталога,
	ДополнительныеПараметры) Экспорт
	СтруктураФайловыхПеременных=СтруктураФайловыхПеременныхСеанса();
	СтруктураФайловыхПеременных.Вставить("РабочийКаталогДанныхПользователя", ИмяКаталога);
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
КонецПроцедуры

#КонецОбласти
#Область ЗапускПриложения1С


// Описание
// 
// Параметры:
// 	ТипКлиента - Число - Код режима запуска
// 		1 - Конфигуратор
// 		2 - Толстый клиент обычное приложение
// 		3 - Толстый клиент управляемое приложение
// 		4 - Тонкий клиент
// 	Пользователь - Строка - Имя пользователя БД, под которым нужно выполнить запуск
// 	РежимЗапускаПодПользователем - Булево - Определяет, будет ли изменен пароль пользователя перед запуском. После запуска пароль вернется назад
// Возвращаемое значение:
// 	
Функция ЗапуститьСеанс1С(ТипКлиента, Пользователь, РежимЗапускаПодПользователем = Ложь,
	ПаузаПередВосстановлениемПароля = 20) Экспорт
	#Если ВебКлиент Тогда
	
	#Иначе
	Папка1С = КаталогПрограммы();
	
	СтрокаЗапуска = Папка1С;
	
	РасширениеФайлаЗапуска = "";
	Если УИ_ОбщегоНазначенияКлиентСервер.ЭтоWindows() Тогда
		РасширениеФайлаЗапуска=".EXE";
	КонецЕсли;
	
	Если ТипКлиента = 1 Тогда
		СтрокаЗапуска = СтрокаЗапуска + "1cv8" + РасширениеФайлаЗапуска + " DESIGNER";
	ИначеЕсли ТипКлиента = 2 Тогда
		СтрокаЗапуска = СтрокаЗапуска + "1cv8" + РасширениеФайлаЗапуска + " ENTERPRISE /RunModeOrdinaryApplication";
	ИначеЕсли ТипКлиента = 3 Тогда
		СтрокаЗапуска = СтрокаЗапуска + "1cv8" + РасширениеФайлаЗапуска + " ENTERPRISE /RunModeManagedApplication";
	Иначе
		СтрокаЗапуска = СтрокаЗапуска + "1cv8c" + РасширениеФайлаЗапуска + " ENTERPRISE";
	КонецЕсли;
	
	СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
	МассивПоказателейСтрокиСоединения = СтрРазделить(СтрокаСоединения, ";");
	
	СоответствиеПоказателейСтрокиСоединения = Новый Структура;
	Для Каждого СтрокаПоказателяСтрокиСоединения Из МассивПоказателейСтрокиСоединения Цикл
		МассивПоказателя = СтрРазделить(СтрокаПоказателяСтрокиСоединения, "=");
		
		Если МассивПоказателя.Количество() <> 2 Тогда
			Продолжить;
		КонецЕсли;
		
		Показатель = НРег(МассивПоказателя[0]);
		ЗначениеПоказателя = МассивПоказателя[1];
		СоответствиеПоказателейСтрокиСоединения.Вставить(Показатель, ЗначениеПоказателя);
	КонецЦикла;
	
	Если СоответствиеПоказателейСтрокиСоединения.Свойство("file") Тогда
		СтрокаЗапуска = СтрокаЗапуска + " /F" + СоответствиеПоказателейСтрокиСоединения.File;
	ИначеЕсли СоответствиеПоказателейСтрокиСоединения.Свойство("srvr") Тогда
		ПутьКБазе = УИ_СтроковыеФункцииКлиентСервер.ПутьБезКавычек(СоответствиеПоказателейСтрокиСоединения.srvr) + "\"
		+ УИ_СтроковыеФункцииКлиентСервер.ПутьБезКавычек(СоответствиеПоказателейСтрокиСоединения.ref);
		ПутьКБазе = УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(ПутьКБазе);
		СтрокаЗапуска = СтрокаЗапуска + " /S " + ПутьКБазе;
	ИначеЕсли СоответствиеПоказателейСтрокиСоединения.Свойство("ws") Тогда
		СтрокаЗапуска = СтрокаЗапуска + " /WS " + СоответствиеПоказателейСтрокиСоединения.ws;
	Иначе
		Сообщить(СтрокаСоединения);
	КонецЕсли;
	
	СтрокаЗапуска = СтрокаЗапуска + " /N""" + Пользователь + """";
	
	ДанныеСохраненногоПароляПользователяИБ = Неопределено;
	Если РежимЗапускаПодПользователем Тогда
		
		//+issue558
		ПроверкаСложностиПароля = Новый Структура;
		ПроверкаСложностиПароля = УИ_ОбщегоНазначенияВызовСервера.ПолучитьПроверкуСложностиДлинуПаролей(ПроверкаСложностиПароля);		
		УИ_ОбщегоНазначенияВызовСервера.УстановитьПроверкуСложностиДлинуПаролей(ПроверкаСложностиПароля, Истина);
		//+
				
		ВременныйПароль = "yl%AB95KcXTB2Dy";  // используем более сложный пароль (15 символов включая спец. смиволы)
		ДанныеСохраненногоПароляПользователяИБ = УИ_ОбщегоНазначенияВызовСервера.ДанныеСохраненногоПароляПользователяИБ(
		Пользователь);
		УИ_ОбщегоНазначенияВызовСервера.УстановитьПарольПользователюИБ(Пользователь, ВременныйПароль);
		
		СтрокаЗапуска = СтрокаЗапуска + " /P" + ВременныйПароль;
		
		//+issue558
		УИ_ОбщегоНазначенияВызовСервера.УстановитьПроверкуСложностиДлинуПаролей(ПроверкаСложностиПароля);
		//+		
	КонецЕсли;
	
	ДополнительныеПараметрыОповещения = Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("РежимЗапускаПодПользователем", РежимЗапускаПодПользователем);
	ДополнительныеПараметрыОповещения.Вставить("ДанныеСохраненногоПароляПользователяИБ",
	ДанныеСохраненногоПароляПользователяИБ);
	ДополнительныеПараметрыОповещения.Вставить("Пользователь", Пользователь);
	ДополнительныеПараметрыОповещения.Вставить("ПаузаПередВосстановлениемПароля", ПаузаПередВосстановлениемПароля);
	
	Попытка
		НачатьЗапускПриложения(Новый ОписаниеОповещения("ЗапуститьСеанс1СЗавершениеЗапуска", ЭтотОбъект,
		ДополнительныеПараметрыОповещения), СтрокаЗапуска);
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;
	#КонецЕсли
КонецФункции

Процедура ЗапуститьСеанс1СЗавершениеЗапуска(КодВозврата, ДополнительныеПараметры) Экспорт
	Если Не ДополнительныеПараметры.РежимЗапускаПодПользователем Тогда
		Возврат;
	КонецЕсли;
	
	ВремяЗапуска = ТекущаяДата();
	Пока (ТекущаяДата() - ВремяЗапуска) < ДополнительныеПараметры.ПаузаПередВосстановлениемПароля Цикл
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	УИ_ОбщегоНазначенияВызовСервера.ВосстановитьДанныеПользователяПослеЗапускаСеансаПодПользователем(
	ДополнительныеПараметры.Пользователь, ДополнительныеПараметры.ДанныеСохраненногоПароляПользователяИБ);
КонецПроцедуры

#КонецОбласти

#Область МетодыРаботыСФайлами

#Область ДиалогВыбораФайлов

// Пустая структура описания выбираемого файла.
// 
// Возвращаемое значение:
//  Структура -  Пустая структура описания выбираемого файла:
// * ИмяФайла - Строка - 
// * СериализуемыеФорматыФайлов - Массив из Строка - 
// * Форматы - Массив из см. ПустоеОписаниеФорматаВыбираемогоФайла 
Функция ПустаяСтруктураОписанияВыбираемогоФайла() Экспорт
	СтруктураОписания=Новый Структура;
	СтруктураОписания.Вставить("ИмяФайла", "");
	СтруктураОписания.Вставить("СериализуемыеФорматыФайлов", Новый Массив);
	СтруктураОписания.Вставить("Форматы", Новый Массив);

	Возврат СтруктураОписания;
КонецФункции

// Пустое описание формата выбираемого файла.
// 
// Возвращаемое значение:
//  Структура -  Пустое описание формата выбираемого файла:
// * Расширение - Строка - 
// * Имя - Строка - 
// * Фильтр - Строка - 
Функция ПустоеОписаниеФорматаВыбираемогоФайла() Экспорт
	Описание=Новый Структура;
	Описание.Вставить("Расширение", "");
	ОПисание.Вставить("Имя", "");
	ОПисание.Вставить("Фильтр", "");

	Возврат Описание;
КонецФункции

// Добавить формат в описание файла сохранения.
// 
// Параметры:
//  СтруктураОписанияВыбираемогоФайла - см. ПустаяСтруктураОписанияВыбираемогоФайла
//  ИмяФормата - Строка -Имя формата
//  РасширениеФайла - Строка -Расширение файла
//  Фильтр - Строка -  Фильтр
Процедура ДобавитьФорматВОписаниеФайлаСохранения(СтруктураОписанияВыбираемогоФайла, ИмяФормата, РасширениеФайла,
	Фильтр = "") Экспорт
	
	Формат=ПустоеОписаниеФорматаВыбираемогоФайла();
	Формат.Имя=ИмяФормата;
	Формат.Расширение=РасширениеФайла;
	Формат.Фильтр = Фильтр;
	
	СтруктураОписанияВыбираемогоФайла.Форматы.Добавить(Формат);
КонецПроцедуры

// Диалог выбора файла по структуре описания выбираемого файла.
// 
// Параметры:
//  Режим - РежимДиалогаВыбораФайла -  Режим
//  СтруктураОписанияВыбираемогоФайла - см. ПустаяСтруктураОписанияВыбираемогоФайла
// 
// Возвращаемое значение:
//  ДиалогВыбораФайла -  Диалог выбора файла по структуре описания выбираемого файла
Функция ДиалогВыбораФайлаПоСтруктуреОписанияВыбираемогоФайла(Режим, СтруктураОписанияВыбираемогоФайла) Экспорт
	// Нужно запросить имя файла.
	ВыборФайла = Новый ДиалогВыбораФайла(Режим);
	ВыборФайла.МножественныйВыбор = Ложь;
	
	//В линуксе есть проблемы с выбором файла, если в существующем есть тире
	Если Не (УИ_ОбщегоНазначенияКлиентСервер.ЭтоLinux() И СтрНайти(СтруктураОписанияВыбираемогоФайла.ИмяФайла,
																   "-") > 0) Тогда
		ВыборФайла.ПолноеИмяФайла = СтруктураОписанияВыбираемогоФайла.ИмяФайла;
	КонецЕсли;

	Фильтр="";
	Для Каждого ТекФорматФайла Из СтруктураОписанияВыбираемогоФайла.Форматы Цикл
		РасширениеФормата=ТекФорматФайла.Расширение;
		Если ЗначениеЗаполнено(РасширениеФормата) Тогда
			ФильтрФормата="*." + РасширениеФормата;
		Иначе
			ФильтрФормата="*.*";
		КонецЕсли;

		Если ЗначениеЗаполнено(ТекФорматФайла.Фильтр) Тогда
			ФильтрФормата = ТекФорматФайла.Фильтр;
		КонецЕсли;

		Фильтр=Фильтр + ?(ЗначениеЗаполнено(Фильтр), "|", "") + СтрШаблон("%1|%2", ТекФорматФайла.Имя, ФильтрФормата);
	КонецЦикла;

	ВыборФайла.Фильтр = Фильтр;

	Если СтруктураОписанияВыбираемогоФайла.СериализуемыеФорматыФайлов.Количество() > 0 Тогда
		ВыборФайла.Расширение=СтруктураОписанияВыбираемогоФайла.СериализуемыеФорматыФайлов[0];
	ИначеЕсли СтруктураОписанияВыбираемогоФайла.Форматы.Количество() > 0 Тогда
		ВыборФайла.Расширение=СтруктураОписанияВыбираемогоФайла.Форматы[0].Расширение;
	КонецЕсли;

	Возврат ВыборФайла;
КонецФункции



#КонецОбласти

// Начало обеспечения нахождения необходимого каталога на диске. Расширение работы с файлами должно быть пдключено ранее
// 
// Параметры:
//  Каталог -Строка - Каталог
//  ОписаниеОпопвещенияОЗавершении - ОписаниеОповещения - Описание опопвещения о завершении
Процедура НачатьОбеспечениеКаталога(Каталог, ОписаниеОпопвещенияОЗавершении) Экспорт

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Каталог", Каталог);
	ПараметрыОповещения.Вставить("ОповещениеОЗавершении", ОписаниеОпопвещенияОЗавершении);

	Файл = Новый Файл(Каталог);
	Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("НачатьОбеспечениеКаталогаЗавершениеПроверкиНаличияКаталога",
		ЭтотОбъект, ПараметрыОповещения));

КонецПроцедуры

// Новый параметры сохранения файла.
// 
// Возвращаемое значение:
//  Структура -  Новый параметры сохранения файла:
// * РасширениеРаботыСФайламиПодключено - Булево - 
// * АдресФайлаВоВременномХранилище - Строка - 
// * ОповещениеОЗавершении - Неопределено, ОписаниеОповещения - 
// * ПолноеИмяФайла - Строка - 
// * ДиалогВыбораФайла - Неопределено, ДиалогВыбораФайла -
Функция НовыйПараметрыСохраненияФайла() Экспорт
	ПараметрыСохранения = Новый Структура;
	ПараметрыСохранения.Вставить("РасширениеРаботыСФайламиПодключено", Ложь);
	ПараметрыСохранения.Вставить("АдресФайлаВоВременномХранилище", "");
	ПараметрыСохранения.Вставить("ОповещениеОЗавершении", Неопределено);
	ПараметрыСохранения.Вставить("ПолноеИмяФайла", "");
	ПараметрыСохранения.Вставить("ДиалогВыбораФайла", Неопределено);
	
	Возврат ПараметрыСохранения;
	
КонецФункции

// Начать сохранение файла.
// 
// Параметры:
//  ПараметрыСохранения - см. НовыйПараметрыСохраненияФайла
Процедура НачатьСохранениеФайла(ПараметрыСохранения) Экспорт
	
	Если ПараметрыСохранения.РасширениеРаботыСФайламиПодключено Тогда
		НачатьСохранениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами(Истина, ПараметрыСохранения);
	Иначе
		ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("НачатьСохранениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами",
			ЭтотОбъект, ПараметрыСохранения));
	КонецЕсли;
		
КонецПроцедуры

// Новый параметры чтения файла в двоичные данные.
// 
// Параметры:
//  ИдентификаторФормы -УникальныйИдентификатор-Идентификатор формы
// 
// Возвращаемое значение:
//  Структура - Новый параметры чтения файла в двоичные данные:
// * ИдентификаторФормы - Неопределено, УникальныйИдентификатор - 
// * РасширениеРаботыСФайламиПодключено - Булево - 
// * ОповещениеОЗавершении - Неопределено, ОписаниеОповещения - 
// * ПолноеИмяФайла - Строка - 
// * ДиалогВыбораФайла - Неопределено, ДиалогВыбораФайла - 
Функция НовыйПараметрыЧтенияФайла(ИдентификаторФормы) Экспорт
	ПараметрыЧтения = Новый Структура;
	ПараметрыЧтения.Вставить("ИдентификаторФормы", ИдентификаторФормы);
	ПараметрыЧтения.Вставить("РасширениеРаботыСФайламиПодключено", Ложь);
	ПараметрыЧтения.Вставить("ОповещениеОЗавершении", Неопределено);
	ПараметрыЧтения.Вставить("ПолноеИмяФайла", "");
	ПараметрыЧтения.Вставить("ДиалогВыбораФайла", Неопределено);
	
	Возврат ПараметрыЧтения;
КонецФункции

// Начать чтение файла.
// 
// Параметры:
//  ПараметрыЧтения - см. НовыйПараметрыЧтенияФайла
Процедура НачатьЧтениеФайла(ПараметрыЧтения) Экспорт
	Если ПараметрыЧтения.РасширениеРаботыСФайламиПодключено Тогда
		НачатьЧтениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами(Истина, ПараметрыЧтения);
	Иначе
		ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("НачатьЧтениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами",
			ЭтотОбъект, ПараметрыЧтения));
	КонецЕсли;

КонецПроцедуры

// Новый элемент результата чтения файла.
// 
// Возвращаемое значение:
//  Структура - Новый элемент результата чтения файла:
// * Хранение - Строка - 
// * ПолноеИмя - Строка - 
Функция НовыйЭлементРезультатаЧтенияФайла() Экспорт
	Описание = Новый Структура;
	Описание.Вставить("Хранение", "");
	Описание.Вставить("ПолноеИмя", "");
	
	Возврат Описание;
КонецФункции

Процедура НачатьВыборФайлов(ОписаниеОповещенияОЗавершении, Заголовок = "Выберите файлы", Фильтр = "",
	МножественныйВыбор = Ложь) Экспорт
	

КонецПроцедуры

// Показывает диалог выбора файла.
// При работе в веб-клиенте пользователю будет показан диалог установки расширения
// для работы с файлами, если требуется.
//
// Параметры:
//   ОбработчикЗавершения - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана после
//           закрытия диалога выбора с параметрами:
//          * Результат - Массив из Строка - выбранные имена файлов.
//           			- Строка - пустая строка, если пользователь отказался от установки расширения.
//           			- Неопределено - если пользователь отказался от выбора файла.
//      * ДополнительныеПараметры - Структура - дополнительные параметры оповещения.
//   Диалог - ДиалогВыбораФайла - свойства см. в синтакс-помощнике.
//
Процедура ПоказатьДиалогВыбора(ОбработчикЗавершения, Диалог) Экспорт
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
	Контекст.Вставить("Диалог", Диалог);
	
	ОписаниеОповещения = Новый ОписаниеОповещения(
		"ПоказатьДиалогВыбораПриПодключенииРасширенияРаботыСФайлами", ЭтотОбъект, Контекст);
	
	ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(ОписаниеОповещения);
	
КонецПроцедуры



#КонецОбласти

// Найти формы по ключу уникальности.
// 
// Параметры:
//  КлючУникальности -Произвольный - Ключ уникальности
//  ИмяФормыИнструмента - Строка - Имя формы для фильтра
// 
// Возвращаемое значение:
//  Массив из ФормаКлиентскогоПриложения
Функция ФормыПоКлючуУникальности(КлючУникальности, ИмяФормыИнструмента = "") Экспорт
	МассивФорм = Новый Массив(); //Массив из ФормаКлиентскогоПриложения
	
	ТипФормы = УИ_ОбщегоНазначенияКлиентСервер.ТипУправляемойФормы();
	
	Для Каждого ТекОкно ИЗ ПолучитьОкна() Цикл
		Для Каждого ТекСодержимое Из ТекОкно.Содержимое Цикл
			Если ТипЗнч(ТекСодержимое) <> ТипФормы Тогда
				Продолжить;
			КонецЕсли;
			
			Если ТекСодержимое.КлючУникальности <> КлючУникальности Тогда
				Продолжить;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ИмяФормыИнструмента) И НРег(ТекСодержимое.ИмяФормы) <> НРег(ИмяФормыИнструмента) Тогда
				Продолжить;
			КонецЕсли;
			
			МассивФорм.Добавить(ТекСодержимое);
		КонецЦикла;
	КонецЦикла;
	
	Возврат МассивФорм;
КонецФункции

// Начать очистку кэша инструментов на клиенте.
// 
// Параметры:
//  ОписаниеОповещенияОЗавершении - Неопределено, ОписаниеОповещения -  Описание оповещения о завершении
Процедура НачатьОчисткуКэшаИнструментовНаКлиенте(ОписаниеОповещенияОЗавершении = Неопределено) Экспорт
	КаталогВспомогательныхБиблиотекИнструментов=КаталогВспомогательныхБиблиотекИнструментов();
	Если Не ЗначениеЗаполнено(КаталогВспомогательныхБиблиотекИнструментов) Тогда
		Возврат;
	КонецЕсли;
	//@skip-check empty-except-statement
	Попытка
		НачатьУдалениеФайлов(,КаталогВспомогательныхБиблиотекИнструментов);
	Исключение
		
	КонецПопытки;
	
КонецПроцедуры

// Открывает навигационную ссылку в программе, которая ассоциирована с протоколом навигационной ссылки.
//
// Допустимые протоколы: http, https, e1c, v8help, mailto, tel, skype.
//
// Для открытия проводника или файла в программе просмотра не следует формировать ссылку по протоколу file://
// - для открытия проводника см. ОткрытьПроводник.
// - для открытия файла по расширению см. ОткрытьФайлВПрограммеПросмотра.
//
// Параметры:
//  НавигационнаяСсылка - Строка - ссылка, которую требуется открыть.
//  Оповещение - ОписаниеОповещения - оповещение о результате открытия.
//      Если оповещение не задано, в случае ошибки будет показано предупреждение.
//      ПриложениеЗапущено - Булево - Истина, если внешнее приложение не вызвало ошибок при открытии.
//      ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта ОписаниеОповещения.
//
// Пример:
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("e1cib/navigationpoint/startpage"); // начальная страница.
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("v8help://1cv8/QueryLanguageFullTextSearchInData");
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("https://1c.ru");
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("mailto:help@1c.ru");
//  ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку("skype:echo123?call");
//
Процедура ОткрытьНавигационнуюСсылку(НавигационнаяСсылка, Знач Оповещение = Неопределено) Экспорт
	
	// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
	
	Контекст = Новый Структура;
	Контекст.Вставить("НавигационнаяСсылка", НавигационнаяСсылка);
	Контекст.Вставить("Оповещение", Оповещение);
	
	ОписаниеОшибки = УИ_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не удалось перейти по ссылке ""%1"" по причине: 
		           |Неверно задана навигационная ссылка.'"),
		НавигационнаяСсылка);
	
	Если Не ЭтоДопустимаяСсылка(НавигационнаяСсылка) Тогда 
		
		ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		
	ИначеЕсли ЭтоВебСсылка(НавигационнаяСсылка)
		Или ЭтоНавигационнаяСсылка(НавигационнаяСсылка) Тогда 
		
		Попытка
		
#Если ТолстыйКлиентОбычноеПриложение Тогда
			
			НачатьЗапускПриложенияСПодключениемРасширенияРаботыСФайлами(Оповещение, НавигационнаяСсылка);
#Иначе
			ПерейтиПоНавигационнойСсылке(НавигационнаяСсылка);
#КонецЕсли
			
			Если Оповещение <> Неопределено Тогда 
				ПриложениеЗапущено = Истина;
				ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
			КонецЕсли;
			
		Исключение
			ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст);
		КонецПопытки;
		
//	ИначеЕсли ФайловаяСистемаСлужебныйКлиент.ЭтоСсылкаНаСправку(НавигационнаяСсылка) Тогда 
//		
//		ОткрытьСправку(НавигационнаяСсылка);
//		
	Иначе 

		НачатьЗапускПриложенияСПодключениемРасширенияРаботыСФайлами(Оповещение, НавигационнаяСсылка);		
//		Оповещение = Новый ОписаниеОповещения(
//			"ОткрытьНавигационнуюСсылкуПослеПроверкиРасширенияРаботыСФайлами", ФайловаяСистемаСлужебныйКлиент, Контекст);
//		
//		ТекстПредложения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
//			НСтр("ru = 'Для открытия ссылки ""%1"" необходимо установить расширение для работы с 1С:Предприятием.'"),
//			НавигационнаяСсылка);
//		ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстПредложения, Ложь);
		
	КонецЕсли;
	
	// АПК:534-вкл
	
КонецПроцедуры


// Открыть строку кода в специальной форме.
// 
// Параметры:
//  Текст - Строка -Текст
//  Заголовок - Строка -  Заголовок
//  КлючУникальности - Строка -  Ключ уникальности формы
Процедура ОткрытьСтрокуКодаВСпециальнойФорме(Текст, Заголовок, КлючУникальности = "") Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Код", Текст);
	ПараметрыФормы.Вставить("ИмяМодуля", Заголовок);

	ОткрытьФорму("ОбщаяФорма.УИ_ФормаКода",
				 ПараметрыФормы,
				 ,
				 КлючУникальности);
КонецПроцедуры

// Начать выбор настроек импорта для инструмента.
// 
// Параметры:
//  ПараметрыИмпорта - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйПараметрыИмпортаИнструмента
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  Форма - ФормаКлиентскогоПриложения
Процедура НачатьВыборНастроекИмпортаДляИнструмента(ПараметрыИмпорта, ОписаниеОповещенияОЗавершении, Форма) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПараметрыИмпорта", ПараметрыИмпорта);

	ОткрытьФорму("ОбщаяФорма.УИ_НастройкаИмпорта",
				 ПараметрыФормы,
				 Форма,
				 Новый УникальныйИдентификатор,
				 ,
				 ,
				 ОписаниеОповещенияОЗавершении,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

#Область УстаревшиеПроцедурыИФункции

#КонецОбласти


#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

#Область МетодыРаботыСФайлами

// Начать обеспечение каталога завершение проверки наличия каталога.
// 
// Параметры:
//  Существует - Булево - Признак существования каталога
//  ДополнительныеПараметры - Структура - параметры оповещения:
//  	* ОповещениеОЗавершении - ОписаниеОповещения
//  	* Каталог - Строка
Процедура НачатьОбеспечениеКаталогаЗавершениеПроверкиНаличияКаталога(Существует, ДополнительныеПараметры) Экспорт
	Если Существует Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Истина);
		Возврат;
	КонецЕсли;
	Оповещение = Новый ОписаниеОповещения("НачатьОбеспечениеКаталогаЗавершениеСозданияКаталога", ЭтотОбъект,
		ДополнительныеПараметры, "НачатьОбеспечениеКаталогаЗавершениеСозданияКаталогаСОшибкой", ЭтотОбъект);

	НачатьСозданиеКаталога(Оповещение, ДополнительныеПараметры.Каталог);
КонецПроцедуры

// Начать обеспечение каталога завершение проверки наличия каталога.
// 
// Параметры:
//  ИмяКаталога - Строка - строка, содержащая путь к созданному каталогу,
//  ДополнительныеПараметры - Структура - параметры оповещения:
//  	* ОповещениеОЗавершении - ОписаниеОповещения
//  	* Каталог - Строка
Процедура НачатьОбеспечениеКаталогаЗавершениеСозданияКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Истина);
КонецПроцедуры

// Начать обеспечение каталога завершение проверки наличия каталога.
// 
// Параметры:
//  ИнформацияОбОшибке - ИнформацияОбОшибке
//  СтандартнаяОбработка - Булево -
//  ДополнительныеПараметры - Структура - параметры оповещения:
//  	* ОповещениеОЗавершении - ОписаниеОповещения
//  	* Каталог - Строка
Процедура НачатьОбеспечениеКаталогаЗавершениеСозданияКаталогаСОшибкой(ИнформацияОбОшибке, СтандартнаяОбработка,
	ДополнительныеПараметры) Экспорт
	СтандартнаяОбработка = Ложь;
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Ложь);
КонецПроцедуры


// Начать сохранение файла завершение подключения расширения работы с файлами.
// 
// Параметры:
//  Подключено - Булево - Подключено
//  ДополнительныеПараметры - см. НовыйПараметрыСохраненияФайла
Процедура НачатьСохранениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
	Если Подключено <> Истина Тогда
		Возврат;
	КонецЕсли;
	ДополнительныеПараметры.РасширениеРаботыСФайламиПодключено = Истина;
	
	Если ЗначениеЗаполнено(ДополнительныеПараметры.ПолноеИмяФайла) Тогда
		НачатьСохранениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры);
	Иначе
		Диалог = ДополнительныеПараметры.ДиалогВыбораФайла;
		Если Диалог = Неопределено Тогда
			Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
		КонецЕсли;
		Диалог.Показать(Новый ОписаниеОповещения("НачатьСохранениеФайлаЗавершениеВыбораИмениФайла",
			ЭтотОбъект, ДополнительныеПараметры));
	КонецЕсли;
	
КонецПроцедуры

// Начать сохранение файла завершение выбора имени файла.
// 
// Параметры:
//  ВыбранныеФайлы -Массив из Строка-Выбранные файлы
//  ДополнительныеПараметры - см. НовыйПараметрыСохраненияФайла
Процедура НачатьСохранениеФайлаЗавершениеВыбораИмениФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.ПолноеИмяФайла = ВыбранныеФайлы[0];

	НачатьСохранениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры);
КонецПроцедуры

// Начать сохранение файла завершение установки полного имени файла.
// 
// Параметры:
//  ДополнительныеПараметры - см. НовыйПараметрыСохраненияФайла
Процедура НачатьСохранениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры) Экспорт
	ПолучаемыеФайлы = Новый Массив;
	ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ДополнительныеПараметры.ПолноеИмяФайла,
		ДополнительныеПараметры.АдресФайлаВоВременномХранилище));

	НачатьПолучениеФайлов(Новый ОписаниеОповещения("НачатьСохранениеФайлаЗавершениеПомещенияФайлов", ЭтотОбъект,
		ДополнительныеПараметры), ПолучаемыеФайлы, ДополнительныеПараметры.ПолноеИмяФайла, Ложь);

КонецПроцедуры

// Начать сохранение файла неинтерактивно завершение помещения файлов.
// 
// Параметры:
//  ПолученныеФайлы - Массив из ОписаниеПереданногоФайла - Полученные файлы
//  ДополнительныеПараметры - см. НовыйПараметрыИнтерактивногоСохраненияФайла
Процедура НачатьСохранениеФайлаЗавершениеПомещенияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	Если ДополнительныеПараметры.ОповещениеОЗавершении = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОбработкаОповещения = ДополнительныеПараметры.ОписаниеОповещенияОЗавершении;
	
	Если ПолученныеФайлы = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОбработкаОповещения, Неопределено);
		Возврат;
	КонецЕсли;

	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.13") Тогда
		ИмяФайла = ПолученныеФайлы[0].ПолноеИмя;
	Иначе
		ИмяФайла = ПолученныеФайлы[0].Имя;
	КонецЕсли;
	ВыполнитьОбработкуОповещения(ОбработкаОповещения, ИмяФайла);
КонецПроцедуры


// Начать чтение файла завершение подключения расширения работы с файлами.
// 
// Параметры:
//  Подключено - Булево -  Подключено
//  ДополнительныеПараметры - см. НовыйПараметрыЧтенияФайла 
Процедура НачатьЧтениеФайлаЗавершениеПодключенияРасширенияРаботыСФайлами(Подключено, ДополнительныеПараметры) Экспорт
	Если Подключено <> Истина Тогда
		Возврат;
	КонецЕсли;
	ДополнительныеПараметры.РасширениеРаботыСФайламиПодключено = Истина;
	
	Если ЗначениеЗаполнено(ДополнительныеПараметры.ПолноеИмяФайла) Тогда
		НачатьЧтениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры);
	Иначе
		Диалог = ДополнительныеПараметры.ДиалогВыбораФайла;
		Если Диалог = Неопределено Тогда
			Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		КонецЕсли;
		Диалог.Показать(Новый ОписаниеОповещения("НачатьЧтениеФайлаЗавершениеВыбораИмениФайла", ЭтотОбъект,
			ДополнительныеПараметры));
	КонецЕсли;
	
КонецПроцедуры

// Начать чтение файла завершение выбора имени файла.
// 
// Параметры:
//  ВыбранныеФайлы -Массив из Строка-Выбранные файлы
//  ДополнительныеПараметры - см. НовыйПараметрыЧтенияФайла
Процедура НачатьЧтениеФайлаЗавершениеВыбораИмениФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.ПолноеИмяФайла = ВыбранныеФайлы[0];

	НачатьЧтениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры);
КонецПроцедуры

// Начать чтение файла завершение установки полного имени файла.
// 
// Параметры:
//  ДополнительныеПараметры -см. НовыйПараметрыЧтенияФайла
Процедура НачатьЧтениеФайлаЗавершениеУстановкиПолногоИмениФайла(ДополнительныеПараметры) Экспорт
	ПомещаемыеФайлы=Новый Массив;
	ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ДополнительныеПараметры.ПолноеИмяФайла));

	НачатьПомещениеФайлов(Новый ОписаниеОповещения("НачатьЧтениеФайлаЗавершениеПомещенияФайлов", ЭтотОбъект,
		ДополнительныеПараметры), ПомещаемыеФайлы, , Ложь, ДополнительныеПараметры.ИдентификаторФормы);

КонецПроцедуры

// Начать чтение файла завершение помещения файлов.
// 
// Параметры:
//  ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//  ДополнительныеПараметры - см. НовыйПараметрыЧтенияФайла
Процедура НачатьЧтениеФайлаЗавершениеПомещенияФайлов(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт
	Если ПомещенныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ДополнительныеПараметры.ОповещениеОЗавершении = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Файлы = Новый Массив;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл

		Если ПомещенныйФайл.Хранение = "" Тогда
			Продолжить;
		КонецЕсли;

		ОписаниеФайла = НовыйЭлементРезультатаЧтенияФайла();
		ОписаниеФайла.Хранение = ПомещенныйФайл.Хранение;
		Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.13") Тогда
			ОписаниеФайла.ПолноеИмя = ПомещенныйФайл.ПолноеИмя;
		Иначе
			ОписаниеФайла.ПолноеИмя = ПомещенныйФайл.Имя;
		КонецЕсли;

		Файлы.Добавить(ОписаниеФайла);
	КонецЦикла;
	

	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Файлы);
	
КонецПроцедуры

// Показать диалог выбора при подключении расширения работы с файлами.
// 
// Параметры:
//  РасширениеПодключено - Булево -Расширение подключено
//  Контекст - Структура:
//  * ОбработчикЗавершения - ОписаниеОповещения
//  * Диалог - ДиалогВыбораФайла
Процедура ПоказатьДиалогВыбораПриПодключенииРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт
	Если Не РасширениеПодключено Тогда
		ВыполнитьОбработкуОповещения(Контекст.ОбработчикЗавершения, "");
		Возврат;
	КонецЕсли;
	
	Контекст.Диалог.Показать(Контекст.ОбработчикЗавершения);
	
КонецПроцедуры

#КонецОбласти

// Проверяет, является ли переданная строка внутренней навигационной ссылкой.
//  
// Параметры:
//  Строка - Строка - навигационная ссылка.
//
// Возвращаемое значение:
//  Булево - результат проверки.
//
Функция ЭтоНавигационнаяСсылка(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "e1c:")
		Или СтрНачинаетсяС(Строка, "e1cib/")
		Или СтрНачинаетсяС(Строка, "e1ccs/");
	
КонецФункции

// Проверяет, является ли переданная строка веб ссылкой.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
// 
Функция ЭтоВебСсылка(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "http://")  // обычное соединение.
		Или СтрНачинаетсяС(Строка, "https://");// защищенное соединение.
	
КонецФункции

// Проверяет, является ли переданная строка ссылкой на встроенную справку.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
//
Функция ЭтоСсылкаНаСправку(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "v8help://");
	
КонецФункции



// Проверяет, является ли переданная строка допустимой ссылкой по белому списку протоколов.
// 
// Параметры:
//  Строка - Строка - переданная ссылка.
// 
// Возвращаемое значение:
//  Булево
//
Функция ЭтоДопустимаяСсылка(Строка) Экспорт
	
	Возврат СтрНачинаетсяС(Строка, "e1c:")
		Или СтрНачинаетсяС(Строка, "e1cib/")
		Или СтрНачинаетсяС(Строка, "e1ccs/")
		Или СтрНачинаетсяС(Строка, "v8help:")
		Или СтрНачинаетсяС(Строка, "http:")
		Или СтрНачинаетсяС(Строка, "https:")
		Или СтрНачинаетсяС(Строка, "mailto:")
		Или СтрНачинаетсяС(Строка, "tel:")
		Или СтрНачинаетсяС(Строка, "skype:")
		Или СтрНачинаетсяС(Строка, "market:")
		Или СтрНачинаетсяС(Строка, "itms-apps:");
	
КонецФункции


// Продолжение процедуры ОбщегоНазначенияКлиент.ОткрытьНавигационнуюСсылку.
Процедура ОткрытьНавигационнуюСсылкуОповеститьОбОшибке(ОписаниеОшибки, Контекст) Экспорт
	
	Оповещение = Контекст.Оповещение;
	
	Если Оповещение = Неопределено Тогда
		Если Не ПустаяСтрока(ОписаниеОшибки) Тогда 
			ПоказатьПредупреждение(, ОписаниеОшибки);
		КонецЕсли;
	Иначе 
		ПриложениеЗапущено = Ложь;
		ВыполнитьОбработкуОповещения(Оповещение, ПриложениеЗапущено);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти


#Область СлужебныеПроцедурыИФункции


Функция ИнформацияДляПоддержки() 
	СтруктураИнформации = Новый Структура;
	СтруктураИнформации.Вставить("ВариантПоставки", УИ_ОбщегоНазначенияКлиентСервер.ВариантПоставки());
	СтруктураИнформации.Вставить("ВерсияИнструментов", УИ_ОбщегоНазначенияКлиентСервер.Версия());
	
	СистемнаяИнформация = Новый СистемнаяИнформация;
	
	СтруктураИнформации.Вставить("Платформа", СистемнаяИнформация.ВерсияПриложения);
	СтруктураИнформации.Вставить("Клиент", УИ_ОбщегоНазначенияКлиентСервер.ОписаниеОСДляТехподдержки());
	#Если ВебКлиент Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "ВебКлиент");
	#ИначеЕсли ТонкийКлиент Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "ТонкийКлиент");
	#ИначеЕсли МобильноеПриложениеКлиент Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "МобильноеПриложениеКлиент");
	#ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "ТолстыйКлиентОбычноеПриложение");
	#ИначеЕсли ТолстыйКлиентУправляемоеПриложение Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "ТолстыйКлиентУправляемоеПриложение");
	#ИначеЕсли МобильныйКлиент Тогда
		СтруктураИнформации.Вставить("ТипКлиента", "МобильныйКлиент");
	#Иначе
		//@skip-check code-never-compilied
		СтруктураИнформации.Вставить("ТипКлиента", "НеОпределен");
	#КонецЕсли	
	
	УИ_ОбщегоНазначенияВызовСервера.ДополнитьИнформациюДляПоддержкиНаСервере(СтруктураИнформации);
	
	Возврат СтруктураИнформации;
КонецФункции

Функция ИнформацияДляПоддержкиСтрокой(Инфо,Префикс = "") 
	СтрокаПоддержки = "";
	
	Для Каждого Итератор Из Инфо Цикл
		Если ТипЗнч(Итератор) = Тип("КлючИЗначение") Тогда
			Если ТипЗнч(Итератор.Значение) = Тип("Структура") Или ТипЗнч(Итератор.Значение) = Тип("Массив") Тогда
				СтрокаПоддержки = СтрокаПоддержки + ИнформацияДляПоддержкиСтрокой(Итератор.Значение,
																				  ?(ЗначениеЗаполнено(Префикс),
																					Префикс + ".",
																					"") + Итератор.Ключ);
			Иначе
				СтрокаПоддержки = СтрокаПоддержки
								  + ?(ЗначениеЗаполнено(Префикс), Префикс + ".", "")
								  + Итератор.Ключ
								  + "="
								  + Итератор.Значение
								  + ";"
								  + Символы.ПС;
			КонецЕсли;
		ИначеЕсли ТипЗнч(Итератор) = Тип("Структура") Тогда
			СтрокаПоддержки = СтрокаПоддержки + ИнформацияДляПоддержкиСтрокой(Итератор, Префикс);
		Иначе
			СтрокаПоддержки = СтрокаПоддержки
							  + ?(ЗначениеЗаполнено(Префикс), Префикс + ".", "")
							  + Итератор
							  + ";"
							  + Символы.ПС;
		КонецЕсли;
	КонецЦикла;
		
	Возврат СтрокаПоддержки;
КонецФункции

#КонецОбласти
